现在流行的系统一般都采用依赖注入的实现方式,利用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跨平台或扫描二维码关注

.net core依赖注入的封装相关推荐

  1. ASP.NET Core依赖注入深入讨论

    这篇文章我们来深入探讨ASP.NET Core.MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中. 依赖注入是ASP.NET Core的核心,它能让您应用程序中的组件增强 ...

  2. everythingtoolbar.dll”或它的一个依赖项。_ASP.NET Core依赖注入最佳实践、提示和技巧...

    译者前言 本文译自ABP框架的开发博客<ASP.NET Core Dependency Injection Best Practices, Tips & Tricks>一文(原作者 ...

  3. 探索 .NET Core 依赖注入的 IServiceProvider

    在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptor ...

  4. ASP.NET Core依赖注入最佳实践,提示技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  5. ASP.NET Core依赖注入容器中的动态服务注册

    介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...

  6. .net core依赖注入

    .net core依赖注入小结 #依赖注入介绍 .net core 中依赖注入是必不可少的一项必学内容,官方介绍为:依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一 ...

  7. .Net Core 依赖注入

    .Net Core 依赖注入 为什么要使用依赖注入框架 .Net Core DI 核心类 三种生命周期 服务注册 单例注册 作用域注册 瞬时注册 直接注入实例 工厂模式注册 注册不同实例 尝试注册 移 ...

  8. 【ASP.NET Core】ASP.NET Core 依赖注入

    一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...

  9. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

最新文章

  1. java中的Executors简介与多线程在网站上逐步优化的运用案例
  2. 创建java ee_eclipse Java EE安装和web项目的创建
  3. 智器SmartQ T7实体店试用体验
  4. django-模态框添加学生
  5. (38)System Verilog线程并行执行(fork-join_none)
  6. 【Big Data - Hadoop - MapReduce】初学Hadoop之图解MapReduce与WordCount示例分析
  7. 可行后继路由,可行条件和报告距离
  8. MIUI ROM for Milestone 刷机教程
  9. 【零售知识】商品库存成本计算的几种方式
  10. 天正对应cad版本_天正CAD图形找不到可用的AutoCAD版本怎么办?
  11. Apache NiFi简介
  12. Intel 英特尔CPU带字母
  13. 前端“智能”静态资源管理 - Onebox - 博客园
  14. siesta在Linux运行,并行版的SIESTA不能运行
  15. 正则表达式之密码验证
  16. 半监督学习模型: 半监督的SVM
  17. 基于FPGA的DDS信号发生器(vivado版本)
  18. 马云任软银集团董事 阿里巴巴全球化布局明朗
  19. TPAMI 2022|基于最优传输理论的无监督图像重建学习
  20. 好消息!PMP项目管理证书列入急需紧缺专业人才人员

热门文章

  1. 编码之道:取个好名字很重要
  2. php如何读出xml的节点内容 两个例子
  3. 对C# 程序员来说现在是到目前为止最好的时代
  4. android 多布局
  5. 微软 MVP 福利大赏
  6. 再见 Typora,这款 Markdown 编辑器开源又免费!
  7. 如何评价一个开源项目——协作影响力
  8. 全部换新-微软复兴.NET,C#10 .NET6 VS2022各个强势!
  9. 一次Redis client组件性能分析
  10. 如何在 ASP.Net Core 中使用 Autofac