.netCore2.0 程序集DI依赖注入
传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在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依赖注入的更多相关文章
- 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 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...
- Spring详解(三)------DI依赖注入
上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建.初始化.销毁等工作交给spring容器来做.那么创建对象的时候,有可 ...
- Spring:(二)DI依赖注入方式
DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- AngularJS DI(依赖注入)实现推测
AngularJS DI(依赖注入) http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html 回到angularjs:在框架中 ...
- JAVAWEB 一一 Spirng(框架,IOC控制反转,DI依赖注入)
jar包 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...
随机推荐
- SQL Server递归实例
例子一 -- ============================================= -- 根据EID返回其下属的EID,Layer=1表示直接下属,NULL返回所有下属 -- s ...
- django view 装饰器
Django提供了几个可以应用于视图以支持各种HTTP特性的装饰器 Allowed HTTP django.views.decorators.http里的装饰器可以根据请求方法限制对视图的访问. re ...
- OI计算几何 简单学习笔记
学习平面几何,首先我们要会熟练地应用向量,其次也要知道一些基本的几何知识.(其实看看数学课本就可以了吧) 因为是看的蓝书,所以很多东西做了引用.(update:还参考了赵和旭dalao的讲义) 下面先 ...
- python基础,变量,if语句
一.python初识 python是一门 解释型弱类型编程语言. 特点: 简单.明确.优雅 二.python的解释器 CPython. 官方提供的. 内部使用c语言来实现 PyPy. 一次性把我们的 ...
- [转] 翻译130+VIM基本命令
基础 :e filename 在编辑器中打开一个文件 :w 保存文件 :q 退出vim :q! 退出但不保存 :x 写文件(如果有做修改)并退出 :sav filename 保存为 . 在正常模式中重 ...
- [译文]casperjs使用说明-测试
capserjs自带了一个测试框架,它提供了一个使你能够更容易的测试你的web应用的工具集. 注意: 1.1版本变更 这个测试框架,包括它的所有API,仅能使用在casperjs test子命令下 如 ...
- P5038 [SCOI2012]奇怪的游戏 二分+网络流
$ \color{#0066ff}{ 题目描述 }$ Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 \(N \times M\) 的棋盘上玩,每个格子有一个数.每次\(Blinker\)会 ...
- Windows 64位操作系统下安装和配置MySQL
一安装方式 MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的.下面来看看这两种方式: MSI格式的可以直接点击安装,按照它给出的安装提示进行安装,Windows操作系统下一般MySQ ...
- 常见浏览器hack汇总
1.背景渐变bug: ①.ie8 ie9:用滤镜的方式解决: -ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientT ...
- getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor
症状: SpringMVC+MyBatis向数据库插入数据,主键应用ORACLE中自己设置的自增序列会发生如下错误: nested exception is Java.sql.SQLException ...