更新 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. ORA-38301: 无法对回收站中的对象执行 DDL/DML

    我们是在生产系统中遇到,清空回收站,然后禁用回收站即可,这样后面就不会发生,单纯禁用可能仍会报错,因为不会自动清空回收站. purge recyclebin; alter system set rec ...

  2. openstack components internal relations

    1.  各个组件之间可以互相调用(都是common sense) conductor 负责DB的操作. 各个组件之间通过RPC, 序列化通过oslo_versionedobjects. 2. 具体调用 ...

  3. tls 双向认证 client端代码例子

    example: python import httplib import json import ssl import urllib2 import requests CA_FILE = " ...

  4. [c/c++] programming之路(1)、编写程序打开记事本、计算器等

    一.命令行启动程序 通过命令行关闭程序:taskkill /f /im 程序名.exe 二.打开记事本.计算器 #include <stdlib.h> void main(){ syste ...

  5. alloc_skb申请函数分析

    alloc_skb()用于分配缓冲区的函数.由于"数据缓冲区"和"缓冲区的描述结构"(sk_buff结构)是两种不同的实体,这就意味着,在分配一个缓冲区时,需要 ...

  6. Eclipse关联Github

    摘自:http://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html 检查Eclipse中是否已安装Git插件,菜单栏Help -> ...

  7. Python3 tkinter基础 Listbox for+insert 将list中元素导入listbox中

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. Python常用库之Pilow

    基本用法 静态方法 PIL.Image.open(fp, mode=’r’) 传入文件路径(str),返回一个image对象 PIL.Image.alpha_composite(im1, im2) 混 ...

  10. (一)flutter第一天

    import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends S ...