更新 2020-01-11

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

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

更新 2019-05-06

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

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

AddEmail

  1. public static class ServiceCollectionExtensions
  2. {
  3. public static IServiceCollection AddEmail<TEmailService>(
  4. this IServiceCollection services
  5. )
  6. where TEmailService : IEmailService
  7. {
  8. services.AddScoped(typeof(IEmailService), typeof(TEmailService));
  9. return services;
  10. }
  11. }
  12.  
  13. public interface IEmailService
  14. {
  15. string GetValue();
  16. }
  17.  
  18. public class EmailService : IEmailService
  19. {
  20. public string GetValue()
  21. {
  22. return "email v1";
  23. }
  24. }
  25.  
  26. public class NewEmailService : IEmailService
  27. {
  28. public string GetValue()
  29. {
  30. return "email v2";
  31. }
  32. }

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

所有 provider 都在 startup 里配置.

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<Business>(Configuration.GetSection("business"));
  4. services.Configure<Configuration.Email>(Configuration.GetSection("email"));
  5.  
  6. services.AddEmail();
  7. // Razor template
  8. services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
  9. services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
  10.  
  11. // Entity
  12. services.AddScoped(_ => new DB(Configuration.GetConnectionString("DefaultConnection")));
  13.  
  14. // hangfire
  15. services.AddHangfire(config =>
  16. config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
  17.  
  18. // MVC
  19. services.Configure<RazorViewEngineOptions>(options =>
  20. {
  21. options.ViewLocationExpanders.Add(new FeatureLocationExpander());
  22. });
  23. services.AddMvc();
  24. }

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

  1. private readonly DB db;
  2. private ICompositeViewEngine CompositeViewEngine { get; set; }
  3. private ActionContext ActionContext { get; set; }
  4. private IServiceProvider ServiceProvider { get; set; }
  5. private ITempDataProvider TempDataProvider { get; set; }
  6. private Configuration.Email EmailConfig { get; set; }
  7.  
  8. public DebugController(
  9. DB db,
  10. ICompositeViewEngine compositeViewEngine,
  11. IActionContextAccessor actionContextAccessor,
  12. IServiceProvider serviceProvider,
  13. ITempDataProvider tempDataProvider,
  14. IOptionsSnapshot<Configuration.Email> emailOptionsAccessor
  15. )
  16. {
  17. CompositeViewEngine = compositeViewEngine;
  18. ActionContext = actionContextAccessor.ActionContext;
  19. ServiceProvider = serviceProvider;
  20. TempDataProvider = tempDataProvider;
  21. EmailConfig = emailOptionsAccessor.Value;
  22. this.db = db;
  23. }

provider 有 3 个级别

AddSingleton

AddScoped

AddTransient

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

Scope 一个 request 一个实例

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

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

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

就好像这样  services.AddEmail();

做法是开一个扩展方法

  1. namespace Project.Email
  2. {
  3. public static class ServiceCollectionExtensions
  4. {
  5. public static IServiceCollection AddEmail(
  6. this IServiceCollection services)
  7. {
  8. services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
  9. services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
  10. services.AddScoped<EmailService, EmailService>();
  11. return services;
  12. }
  13. }
  14.  
  15. public class EmailService
  16. {
  17. public EmailService()
  18. {
  19.  
  20. }
  21.  
  22. public string name { get; set; } = "dada";
  23. }
  24. }

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. sync—WaitGroup

    用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ...

  2. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)

    前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...

  3. 第一章-硬件组成及linux发展历史(1)

    一.服务器与计算机的组成? 计算机组成主要有:CPU.硬盘.内存.电源.显示器.鼠标.键盘 服务器组成主要有:CPU.硬盘.内存.电源.RAID卡.远程控制卡 CPU: 即:中央处理器,是一块超大规模 ...

  4. 前后台分离开发--文件上传与下载,cookie,session

    一.前后台分离开发的概念 ''' 1. 前台页面运行在前台服务器上,负责页面的渲染(静态文件的加载)与转跳 2. 后台代码运行在后台服务器上,负责数据的处理(提供数据请求的接口) ''' #如果没有前 ...

  5. iOS字体大小

    1,iOS 字体大小单位是pt——磅. 英文字体的1磅,相当于1/72 英寸,约等于1/2.8mm. px:相对长度单位.像素(Pixel).(PS字体) pt:绝对长度单位.点(Point).(iO ...

  6. 解决Access查询不区分大小写问题

    1.问题 比如查询用户名密码,会将所有没区分大小写的结果拿出来 2.解决 使用StrComp函数 QString execStr = QString("select * from [tabl ...

  7. String,InputStream相互转换

    一. InputStream转换为String 转换的过程是: 使用FileInputStream读取文件流: 使用InputStreamReader读取FileInputStream流: 使用Buf ...

  8. chrome浏览器中的百度搜索引擎总是先自动跳转到百度首页怎么办?

    1.修改百度搜索引擎代码如下: http://www.baidu.com/s?wd=%s&ie={inputEncoding} 备注:现在chorme不能直接在默认的百度搜索引擎上修改,而且自 ...

  9. 买不到的数目|2018年蓝桥杯A组题解析第八题-fishers

    买不到的数目 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖 ...

  10. Shell 基础知识和总结

    调试脚本 检查脚本语法错误 bash -n /path/to/some_script 调试执行 bash -x /path/to/some_script shell里的变量 本地变量:只对当前shel ...