.net core依赖注入的封装

现在流行的系统一般都采用依赖注入的实现方式,利用DI容器来直接获取所用到的类/接口的实例。.net core也一样采用DI的方式,提供了DI容器的接口IServiceCollection,并提供了基于该接口的缺省实现ServiceCollection。

这样我们就可以不再像以前一样,需要引入第三方的Untiy、Autofac、Castle等DI组件了。

在.net core源码的ServiceCollectionExtensions的实现中,有三个注册的方法AddScoped、AddSingleton、AddTransient。这其中的三个选项(Singleton、Scoped和Transient)体现三种对服务对象生命周期的控制形式。

  • Singleton:ServiceProvider创建的服务实例保存在作为根节点的ServiceProvider上,所有具有同一根节点的所有ServiceProvider提供的服务实例均是同一个对象。适合于单例模式。

  • Scoped:ServiceProvider创建的服务实例由自己保存,所以同一个ServiceProvider对象提供的服务实例均是同一个对象。 可以简单的认为是每请求(Request)一个实例。

  • Transient:针对每一次服务提供请求,ServiceProvider总是创建一个新的服务实例。 每次访问时被创建,适合轻量级的,无状态的服务。

这个具体说起来就太多了,还是查阅相关材料吧J

 

有了DI容器,我们在使用时,可以简单的在Startup.cs程序中编写上注册语句,下面以操作日志的仓储类为例:

public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IOperLogRepository, OperLogRepository>();
}

 第一个泛型类型表示将要从容器中请求的类型(通常是一个接口)。第二个泛型类型表示将由容器实例化并且用于完成这些请求的具体类型。

 

我们在操作日志的逻辑服务类使用操作日志的仓储时,就这样写:

public partial class OperLogAppService : IOperLogAppService
{
private IOperLogRepository service;
public OperLogAppService(IOperLogRepository service)
{
this.service = service;
}

public void Write(OperLogDto operLogDto)
{
this.service.Insert(operLogDto.AsInfo());
}
}

 系统会在创建OperLogAppService的实例时,会自动创建IOperLogRepository在DI容器中注册OperLogRepository类的实例。

然而这种方式在框架中是有些不方便的。我们知道,框架要求的是可扩展,可配置,在新增系统功能模块时,还需要手工修改程序,在Startup.cs的ConfiguraeService中增加注册(就算把所有注册移到一个独立的方法中也是一样),就如同第一个代码写的一样,包括注册仓储类、注册逻辑服务类等等。然后编译,再发布运行。每增加、修改一个模块,都需要整个系统编译、发布,对运行中的系统影响还是挺大的。

我们的做法是,功能模块都有一个自注册的类。这个自注册的类会将功能模块中所有的仓储类、逻辑服务类等都注册进DI容器中。Startup.cs会自动查找所有功能模块中的自注册类,然后将相关内容注册进DI容器中。这样就可以做到,每增加一个模块,只需要将该模块的应用程序集Dll复制到系统的运行目录就行了,其他的系统帮你搞定。

按照上述思路,首先是建一个自注册的类。这个类都抽象出一个接口IServiceRegister

public interface IServiceRegister
{
/// <summary
/// 注册
/// </summary>
void Register(IServiceCollection services);
}

 

我们以通用模块为例子,自注册的类应该是这样的。

 public class CommonServiceRegister : IServiceRegister
{
public void Register(IServiceCollection services)
{
services.AddDbContext<CommonDbContext>(option =>
option.UseDb<CommonDbContext>(services.BuildServiceProvider()),
ServiceLifetime.Scoped);
services.AddScoped<IParaReferRepository, ParaReferRepository>();
services.AddScoped<IParaReferAppService, ParaReferAppService>();
services.AddScoped<ISystemParameterRepository, SystemParameterRepository>();
services.AddScoped<ISystemParameterAppSer

这个类中service.AppScoped注册的是仓储层和逻辑层接口对应的实现类,我们这里只是列出了系统参数和引用参数的注册。对于第一句AddDbContext,请参见:4.4 异构、多数据库的存取组件

为了在Startup.cs中自己查找并调用这些注册类,还是比较简单的,程序如下:调用ReflectionHelper的GetSubTypes方法,获取所有继承IServiceRegister的实现类,对于每个实现类,创建实例并将模块的仓储和逻辑服务注册到DI容器中。ReflectionHelper的GetSubTypes方法,请参见:4.1 反射工具

 IEnumerable<Type> serviceList = ReflectionHelper.GetSubTypes<IServiceRegister>();
foreach (Type type in serviceList)
{
IServiceRegister register = ReflectionHelper.CreateInstance(type)
as IServiceRegister;
register.Register(services);

}

 

.net framework也可以按照上述思路进行,不同的就是.net framework没有startup.cs,只需要将上面的内容写进global.asax即可,还有一点不同是IServiceCollection,可以使用Unity等DI组件提供的DI容器。

原文地址:http://www.cnblogs.com/BenDan2002/p/6087893.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图的深度优先遍历+图解

图解 代码实现 package com.atguigu.graph;import java.util.ArrayList; import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class Graph {private ArrayList<String> vertexList;//存储顶点集合private int[][] edges;//存储图对应的邻接矩阵…

Azure SQL的DTU和eDTU到底是个什么鬼

Azure SQL 使用了数据库事务单位 (DTU) 和弹性数据库事务单位 (eDTU)来作为一个计量单位。 但是DTU和eDTU是什么鬼啊? 官方文档这样解释 DTU 是一个资源度量单位&#xff0c;表示保证可用于单一数据库服务层内特定性能级别的单个 Azure SQL 数据库的资源。 DTU是一定比例的 C…

2015蓝桥杯省赛---java---B---1(三角形面积)

题目 三角形面积 解法 数学方法&#xff0c;直接求三角形的面积 88 - (82)/2 - (46)/2 - (84)/2 64 - (81216) 64 - 36 28 答案 28

深入理解Async/Await

C# 5 Async/Await 语法特性&#xff0c;极大地简化了异步编程&#xff0c;但我们知道&#xff0c;异步编程的基本原理并没有发生根本改变。也就是说&#xff0c;当一些复杂的东西看起来很简单时&#xff0c;它通常意味着有一些有趣的事情在背后发生。在计算机程序设计语言领域&…

2015蓝桥杯省赛---java---B---2(立方变自身)

题目 立方变自身 分析 简单枚举 i^3 99之后&#xff0c;数字越大&#xff0c;数字之和越不可能等于其自身。 代码 package com.atguigu.TEST;public class Demo01 {private static int ans;public static void main(String[] args) { // 6for (int i 1; i < 99; i) {…

【南京】.Net 开源基础服务线下技术交流会

南京地区的.net开发人员对基础服务这块感兴趣的&#xff0c;欢迎大家参加及会后继续交流&#xff0c;踊跃参与&#xff01;若对基础服务相关有深度技术交流的&#xff0c;后续交换联系方式&#xff0c;可一起深度合作。 .NET技术行业落地分享交流会 邀请南京地区.NET技术专家和…

mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

MySQL常用的语句语法注意&#xff1a;1、 | 符号用来指出几个选中中的一个&#xff0c;因此NULL | NOT NULL 表示给出null 或 not null2、包含在方括号中的关键字或子句是可选的(如 [like this])3、既没有列出所有的MySQL语句&#xff0c;也没有列出每一条子句和选项4、大写的表…

图的广度优先算法+遍历

图解 代码实现 package com.atguigu.graph;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class Graph {private ArrayList<String> vertexList;//存储顶点集合private int[][…

.Net异步编程知多少

1. 引言 最近在学习Abp框架&#xff0c;发现Abp框架的很多Api都提供了同步异步两种写法。异步编程说起来&#xff0c;大家可能都会说异步编程性能好。但好在哪里&#xff0c;引入了什么问题&#xff0c;以及如何使用&#xff0c;想必也未必能答的上来。 自己对异步编程也不是很…

指纹识别开发1.0

在不久之前&#xff0c;用java和C#分别开发了个人脸识别&#xff0c;感觉挺不错的&#xff0c;于是脑袋一发热&#xff0c;想了想能不能搞个指纹识别&#xff0c;答案当然是能&#xff0c;那么问题来了&#xff0c;在人脸识别的时候可以借助自带摄像头提取你的face&#xff0c;…

DFS VS BFS

实际案例 代码实现 package com.atguigu.graph;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class Graph {private ArrayList<String> vertexList;//存储顶点集合private in…

CLR运行时细节 - Method Descriptor

方法描述符:MethodDesc 运行时用来描述类型的托管方法,它保存在方法描述桶(MethodDescChunk)内;方法描述符保存了方法在运行时的一些重要信息:是否JIT编译;是否有方法表槽(决定了方法入口是跟在方法描述符(MethodDesc)后还是在方法表(MethodTable)后面);距离MethodDescChunk的索…

2015蓝桥杯省赛---java---B---3(三羊献瑞)

题目 三羊献瑞 思路分析 由于是填空题&#xff0c;没有时间和内存的要求&#xff0c;所以看到这个题&#xff0c;第一想法就是暴力破解&#xff0c;当然了&#xff0c;怎么快就怎么做。 由于 "三"是数字的首位&#xff0c;低位的数字进位后必然为1&#xff0c;所…

mysql common是什么_MySQL common_schema简介

common_schema为MySQL提供了查询脚本&#xff0c;分析并且信息化的视图和一个函数库&#xff0c;以便更容易的管理和诊断。它引入的一些基于SQL的工具简common_schema的简介&#xff1a;Shlomi Noach 的common_schema项目()是一套针对服务器脚本化和管理的强大的代码和视图。co…

数据库权限分配探讨

上周&#xff0c; 有位朋友给我提出了这样的需求&#xff1a;区分用户访问数据库的权限。顺便总结了下有如下要求&#xff1a; 某个用户查询所有数据库的权限 某个用户只有备份数据库的权限 给一个用户只能查看指定数据库的权限 给一个用户只有某个表的权限 要进行以上任务&…

2015蓝桥杯省赛---java---B---6(加法变乘法)

题目 加法变乘法 思路分析 两个算式进行相减操作 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举public static void main(String[] args) {for (int i 1; i < 46; i) {for (int j i 2; j < 48; j) {if (i * (i 1) - (i i 1) j * (…

DI 之Spring更多DI的知识

转载自 【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3 3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化&#xff0c;指不提前初始化Bean&#xff0c;而是只有在真正使用时才创建及初始化Bean。 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值…

Microsoft发布新工具,简化JavaScript Web应用的创建

Microsoft发布了一系列工具用于快速生成基于JavaScript的Web应用&#xff0c;这些工具包含了dotnet new和对Node.js的巧妙运用。 dotnet new命令是.NET Core工具的一部分&#xff0c;它用简单的命令行语法创建&#xff08;spin up&#xff09;新项目。现在新工具已成为ASP.NET …

2015蓝桥杯省赛---java---B---7(牌型种数)

题目 牌型种数 思路分析 递归进行实现&#xff0c;弄好终止条件&#xff0c;牌的数目等于13 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举private static int ans;public static void main(String[] args) {f(0, 0);System.out.println(ans);}…

CLR运行时细节 - 继承多态的实现

关于多态不多解释了,在运行时决定和调用具体的实现,是面向对象的基础 设计模式的基础.准备把继承多态和接口多态分开,因为从CLR实现的角度继承多态相比于接口多态要简单得多,也更容易理解,本篇只讨论继承多态, .NET Framework 2.0 和 4.0 这两个版本在实现上稍微有点区别(这里先…