传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在Startup.cs中复制注入上百次,虽然能解决问题,但是显然有点笨拙。

下面介绍一个程序集DI依赖注入,即通过反射进行文件注入

首先通过反射获取当前程序集

/// <summary>
/// 通过程序集的名称加载程序集
/// </summary>
/// <param name="assemblyName"></param>
/// <returns></returns>
public static Assembly GetAssemblyByName(string assemblyName)
{
return AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName));
}

程序集依赖注入方法,逻辑不多描述,全在注释中

/// <summary>
/// 程序集依赖注入
/// </summary>
/// <param name="services">服务实例</param>
/// <param name="assemblyName">程序集名称。不带DLL</param>
/// <param name="serviceLifetime">依赖注入的类型 可为空</param>
public static void AddAssembly(this IServiceCollection services, string assemblyName, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped)
{
if (services == null)
throw new ArgumentNullException(nameof(services) + "为空"); if (String.IsNullOrEmpty(assemblyName))
throw new ArgumentNullException(nameof(assemblyName) + "为空"); var assembly = RuntimeHelper.GetAssemblyByName(assemblyName); if (assembly == null)
throw new DllNotFoundException(nameof(assembly) + ".dll不存在");
//找到当前程序集的类集合
var types = assembly.GetTypes();
//过滤筛选(是类文件,并且不是抽象类,不是泛型)
var list = types.Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericType).ToList();
if (list == null && !list.Any())
return;
//遍历获取到的类
foreach (var type in list)
{
//然后获取到类对应的接口
var interfacesList = type.GetInterfaces();
//校验接口存在则继续
if (interfacesList == null || !interfacesList.Any())
continue;
//获取到接口(第一个)
var inter = interfacesList.First();
switch (serviceLifetime)
{
//根据条件,选择注册依赖的方法
case ServiceLifetime.Scoped:
//将获取到的接口和类注册进去
services.AddScoped(inter, type);
break;
case ServiceLifetime.Singleton:
services.AddScoped(inter, type);
break;
case ServiceLifetime.Transient:
services.AddTransient(inter, type);
break;
}
}
}

具体在Startup.cs 中调用如下

//程序集依赖注入(General.Services程序集名称) services.AddAssembly("General.Services");

.netCore2.0 程序集DI依赖注入的更多相关文章

  1. DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比

    DI 依赖注入之unity的MVC版本使用Microsoft.Practices.Unity1.2与2.0版本对比 参考:https://www.cnblogs.com/xishuai/p/36702 ...

  2. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  3. 谈谈php里的IOC控制反转,DI依赖注入

    理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...

  4. IoC控制反转与DI依赖注入

    IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...

  5. Spring详解(三)------DI依赖注入

    上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...

  6. Spring:(二)DI依赖注入方式

    DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...

  7. 一) Spring 介绍、IOC控制反转思想与DI依赖注入

    一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...

  8. AngularJS DI(依赖注入)实现推测

    AngularJS DI(依赖注入) http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html 回到angularjs:在框架中 ...

  9. JAVAWEB 一一 Spirng(框架,IOC控制反转,DI依赖注入)

    jar包 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...

随机推荐

  1. asp.net—— 基础之截取字符串

    在实际开发中有时难免会遇到需要获取某个字符串中的某些字符串,这里我们可以用到字符串截取的办法. 截取字符串的方法很容易(暂不包含中文字符串),只要稍微有点.net基础的人看了都能看懂. /// < ...

  2. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

  3. Django自带表User认证详解

    认证登陆(附方法实现代码,百度网盘拉取即可下载,激活码:gqt1) 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然 ...

  4. CF1059C Sequence Transformation 题解

    这几天不知道写点什么,状态也不太好,搬个题上来吧 题意:给定一个数n,设一个从1到n的序列,每次删掉一个序列中的数,求按字典序最大化的GCD序列 做法:按2的倍数找,但是如果除2能得到3的这种情况要特 ...

  5. UIView之setNeedsDisplay与drawRect 和 setNeedsLayout与layoutSubViews

    1.UIView的setNeedsDisplay和setNeedsLayout方法 首先两个方法都是异步执行的.而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到  UI ...

  6. <转>jmeter JDBC Request之Query Type

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  7. Easyui里面动态设置输入框的可见性

    JQuery EasyUI 动态隐藏   一.隐藏datagrid某一列 $('#dg').datagrid('hideColumn', 'field'); 二.隐藏html的lable.input标 ...

  8. 2016级算法第三次上机-B.Bamboo和巧克力工厂

    B Bamboo和巧克力工厂 分析 三条流水线的问题,依然是动态规划,但是涉及的切换种类比较多.比较易于拓展到n条流水线的方式是三层循环,外层是第k个机器手,里面两层代表可切换的流水线 核心dp语句: ...

  9. vi基本状态

    vi状态退出并保存:shift+ZZ vi readme.txt 进入VIM编辑器,可以新建文件也可以修改文件 如果这个文件,以前是没有的,则为新建,则下方有提示为新文件. 按ESC键 跳到命令模式, ...

  10. 06. 用css实现三角形

    用css实现三角形   <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...