更新 2020-01-11

动态创建 class 并且可以使用 DI, 这样反射样就可以了

var instance = ActivatorUtilities.CreateInstance<AbcService>(serviceProvider);

更新 2019-05-06

用泛型来传 class, 这样比较方便扩展

services.AddEmail<EmailService>();
services.AddEmail<NewEmailService>();

AddEmail

public static class ServiceCollectionExtensions
{
public static IServiceCollection AddEmail<TEmailService>(
this IServiceCollection services
)
where TEmailService : IEmailService
{
services.AddScoped(typeof(IEmailService), typeof(TEmailService));
return services;
}
} public interface IEmailService
{
string GetValue();
} public class EmailService : IEmailService
{
public string GetValue()
{
return "email v1";
}
} public class NewEmailService : IEmailService
{
public string GetValue()
{
return "email v2";
}
}

比起 Angular 的依赖注入, core 的相对简单许多, 容易明白

所有 provider 都在 startup 里配置.

public void ConfigureServices(IServiceCollection services)
{
services.Configure<Business>(Configuration.GetSection("business"));
services.Configure<Configuration.Email>(Configuration.GetSection("email")); services.AddEmail();
// Razor template
services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); // Entity
services.AddScoped(_ => new DB(Configuration.GetConnectionString("DefaultConnection"))); // hangfire
services.AddHangfire(config =>
config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"))); // MVC
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new FeatureLocationExpander());
});
services.AddMvc();
}

controller 就通过 constructor 来注入就可以了.

private readonly DB db;
private ICompositeViewEngine CompositeViewEngine { get; set; }
private ActionContext ActionContext { get; set; }
private IServiceProvider ServiceProvider { get; set; }
private ITempDataProvider TempDataProvider { get; set; }
private Configuration.Email EmailConfig { get; set; } public DebugController(
DB db,
ICompositeViewEngine compositeViewEngine,
IActionContextAccessor actionContextAccessor,
IServiceProvider serviceProvider,
ITempDataProvider tempDataProvider,
IOptionsSnapshot<Configuration.Email> emailOptionsAccessor
)
{
CompositeViewEngine = compositeViewEngine;
ActionContext = actionContextAccessor.ActionContext;
ServiceProvider = serviceProvider;
TempDataProvider = tempDataProvider;
EmailConfig = emailOptionsAccessor.Value;
this.db = db;
}

provider 有 3 个级别

AddSingleton

AddScoped

AddTransient

单列是说整个 App 用一个实例

Scope 一个 request 一个实例

transient 则是每一个注入一个实例

一个模块一般上会提供好多 Service

那么要让 startup 干净一些的话,我们可以包装起来

就好像这样  services.AddEmail();

做法是开一个扩展方法

namespace Project.Email
{
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddEmail(
this IServiceCollection services)
{
services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<EmailService, EmailService>();
return services;
}
} public class EmailService
{
public EmailService()
{ } public string name { get; set; } = "dada";
}
}

Asp.net core 学习笔记 ( DI 依赖注入 )的更多相关文章

  1. angular2 学习笔记 ( DI 依赖注入 )

    refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency ...

  2. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  3. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务

    毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...

  5. [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期

    生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...

  6. [ASP.NET Core 3框架揭秘] 依赖注入[10]:与第三方依赖注入框架的适配

    .NET Core具有一个承载(Hosting)系统,承载需要在后台长时间运行的服务,一个ASP.NET Core应用仅仅是该系统承载的一种服务而已.承载系统总是采用依赖注入的方式来消费它在服务承载过 ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入[9]:实现概述

    <服务注册>.<服务消费>和<生命周期>主要从实现原理的角度对.NET Core的依赖注入框架进行了介绍,接下来更进一步,看看该框架的总体设计和实现.在过去的多个版 ...

  8. [ASP.NET Core 3框架揭秘] 依赖注入[7]:服务消费

    包含服务注册信息的IServiceCollection集合最终被用来创建作为依赖注入容器的IServiceProvider对象.当需要消费某个服务实例的时候,我们只需要指定服务类型调用IService ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入[6]:服务注册

    通过<利用容器提供服务>我们知道作为依赖注入容器的IServiceProvider对象是通过调用IServiceCollection接口的扩展方法BuildServiceProvider创 ...

随机推荐

  1. DATAPUMP PERFORMANCE EXPDP IS VERY SLOW 10.2.0.4 TO 11.2.0.2

    APPLIES TO: Oracle® Database - Enterprise Edition - Version 10.2.0.4 to 11.2.0.2 [Release 10.2 to 11 ...

  2. 微信小程序 windos server 2008 iis 7 tls1.0 升级 tls1.2

    执行下面注册表:重启服务器 下载:tls 1.2.reg 1.代码如下 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ ...

  3. vim 快捷键(update)

    网上盗的图,233   2018年08月31日14:31:19 update: 批量行操作 esc->ctrl+v->选中批量行->shift+i->operation-> ...

  4. tftp 传输文件

    tftp 服务方便文件传输,但是没有理清的话,容易传输错误. -g 表示下载文件 (get) -p 表示上传文件 (put)-l 表示本地文件名 (local file) -r 表示远程主机的文件名 ...

  5. 线性回归、Logistic回归、Softmax回归

    线性回归(Linear Regression) 什么是回归? 给定一些数据,{(x1,y1),(x2,y2)…(xn,yn) },x的值来预测y的值,通常地,y的值是连续的就是回归问题,y的值是离散的 ...

  6. Ant build.xml详解

    Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实 ...

  7. topcoder srm 480 div1

    problem1 link 直接模拟即可. problem2 link 首先,网关一定是安装在client与server之间的链路上.而不会安装在client与client之间的链路上.对于一条路径c ...

  8. Hunter’s Apprentice 【判断多边形边界曲线顺逆时针】

    问题 H: Hunter's Apprentice 时间限制: 1 Sec  内存限制: 128 MB 提交: 353  解决: 39 [提交] [状态] [命题人:admin] 题目描述 When ...

  9. Hakase and Nano 【思维博弈】

    Hakase and Nano 时间限制: 1 Sec  内存限制: 128 MB 提交: 400  解决: 104 [提交] [状态] [命题人:admin] 题目描述 Hakase and Nan ...

  10. 最最简单的c语言函数汇编分析

    0x01 环境 xp+vc6.0 0x02 代码 int plus(int x, int y) { return 0; } 以下是vc6.0的反汇编窗口 1: int plus(int x, int ...