现在流行的系统一般都采用依赖注入的实现方式,利用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<ISystemParameterAppService, SystemParameterAppService>();

}
}

这个类中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容器。

面向云的.net core开发框架

4.6 .net core依赖注入的封装的更多相关文章

  1. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  2. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  3. 自动化CodeReview - ASP.NET Core依赖注入

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...

  4. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  5. .NET Core依赖注入集成Dynamic Proxy

    在<Castle DynamicProxy基本用法>中介绍了如何将DP与Autofac集成使用,而 .NET Core有自己的依赖注入容器,在不依赖第三方容器的基础上,如何实现动态代理就成 ...

  6. ASP.NET Core依赖注入系统学习教程:关于服务注册使用到的方法

    在.NET Core的依赖注入框架中,服务注册的信息将会被封装成ServiceDescriptor对象,而这些对象都会存储在IServiceCollection接口类型表示的集合中,另外,IServi ...

  7. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  8. net core 依赖注入问题

    net core 依赖注入问题 最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久 ...

  9. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

随机推荐

  1. BPM配置故事之案例9-根据表单数据调整审批线路2

    老李:好久不见啊,小明. 小明:-- 老李:不少部门有物资着急使用,现在的审批流程太慢了,申请时增加一个是否加急的选项吧.如果选加急,金额1000以下的直接到我这里,我审批完就通过,超过1000的直接 ...

  2. 多本地代码工作点更新到2个远端GIT仓库

    摘要:本文介绍了笔者多个本地工作节点(地方)的多台电脑(PC/笔记本电脑)同步源码到2个远端的GIT(一个GITHUB国外强制公开,一个oschina国内可不公开). 作者:太初 转载说明:请指明原作 ...

  3. 免费SSL证书 之Let’s Encrypt申请与部署(Windows Nginx)

    我着着皇帝的新衣,但是你看不见    有一颗愿意等待的心,说明你对未来充满希望.有一颗充满希望的心,那么等待又算什么.人就是在等待与希望中度过,我们永远要对未来充满信心! 读在最前面: 1.本文案例为 ...

  4. 从myeclipse导入eclipse,不能识别为web项目(java项目转为web项目)

    1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存:         ...

  5. 基于Adobe Flash平台的3D页游技术剖析

    写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...

  6. [转]Java实现定时任务的三种方法

    在应用里经常都有用到在后台跑定时任务的需求.举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据.文件等.在本文里,我会给大家介绍3种不同的实现方法: 普通thread实现 Tim ...

  7. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  8. wordpress去掉导航栏链接中的category

    找到服务器目录下的functions..php文件,在末尾处添加如下内容即可. 路径:/htdocs/wp-content/themes/functions.php 要追加在functions.php ...

  9. 偶遇this之坑

    前言 在写一个懒加载插件时,遇到一个坑,就是this的指向问题,我想这种情况大部分人都会遇到,就写下来,新手也有个参考. 事件 有些页面图片比较多,但用户还不一定会全看,这样的话,全部去加载这些图片, ...

  10. C/S架构和B/S架构的概念和区别

    C/S 架构 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端 ...