asp.net core 系列 3 依赖注入

一. 依赖注入概述

  在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在ASP.NET Core中的实现。

  直接依赖是指:当一个类需要另一个类协作来完成工作的时候就产生了依赖。举例比如:模块 A 调用模块 B 中的函数,而模块 B 又调用模块 C 中的函数,则编译时 A 取决于 B,而 B 又取决于 C。这是有严重的依赖关系,不属于松散耦合。

  依赖反转是指:高层模块不应该依赖低层模块,二者都应该依赖于抽象,是对接口而不是实现编程。当一个类(Class)需要被外部依赖,就需要把它抽象成一个接口(interface),如何把这个接口变成具体可调用的实例,就是由依赖注入来完成。依赖反转是生成松散耦合应用程序的关键一环。当应用依赖反转原则后,A 可以调用 B 实现的抽象上的方法,让 A 可以在运行时调用 B,而 B 又在编译时依赖于 A 控制的接口。 运行时程序执行的流程保持不变,但接口引入意味着可以轻松插入这些接口的不同实现

  假设一个方法从流读取字节,并把它们写入某个缓冲:

//直接依赖 这里的伪代码依赖于两个低层模块,读取器和写入器。
void Copy()
    {
        Byte byte1;
        Reader reader = new Reader();
        Writer writer = new Writer();
        while (byte1 = reader.ReadFromStream())
            writer.WriteTobuffer(byte1);
    }
//依赖反转 这里的伪代码依赖于两个抽象类,读取器和写入器。
void Copy(IReader reader, IWriter writer)
    {
        Byte byte1;
        while (byte1 = reader.ReadFromStream())
            writer.WriteTobuffer(byte1)
    }

  上面接口的读取器和写入器的实例谁来提供呢?需要使用依赖注入模式。实现依赖注入需要使用IoC 容器,目前有Unity和MEF 2 二种IoC 容器工具来实现。以及下面讲到ASP.NET Core自带的依赖注入实现。

二. ASP.NET Core依赖注入

  ASP.NET Core 支持依赖关系注入的设计模式,是类及其依赖关系之间实现控制反转 (IoC)的技术。在ASP.NET Core中依赖注入解决的问题包括:

  (1) 使用接口抽象化依赖关系实现。

  (2) 注册服务容器中的依赖关系。ASP.NET Core内置的服务容器 IServiceProvider。 实现在Startup.ConfigureServices 方法中注册服务(服务一般是接口)。

  (3) 将服务注入到使用它的类的构造函数中。

  下面示例中,使用具体类型 MyDependency 注册 IMyDependency 服务, 注册将服务生存期的范围限定为单个请求的生存期。在MyDependency实现类中使用框架内部已注入好的ILogger来帮助打印日志输出。

    // 第一步 使用接口抽象化来实现依赖反转, 定义 IMyDependency 服务
    public interface IMyDependency
    {
        Task WriteMessage(string message);
    }
    // IMyDependency 服务的实现类
    public class MyDependency : IMyDependency
    {
        private readonly ILogger<MyDependency> _logger;

        public MyDependency(ILogger<MyDependency> logger)
        {
            _logger = logger;
        }

        public Task WriteMessage(string message)
        {
            _logger.LogInformation(
                "MyDependency.WriteMessage called. Message: {MESSAGE}",
                message);
            return Task.FromResult(0);
        }
}
// 第二步在 将IMyDependency服务注册到服务容器中。
    public void ConfigureServices(IServiceCollection services)
        {
          //....
           //每次请求时创建,贯穿整个请求
            services.AddScoped<IMyDependency, MyDependency>();
          //....
 }
// 第三步 将服务注入到使用它的类的构造函数中,在Index.cshtml.cs类中调用IMyDependency服务的WriteMessage方法
    public class IndexModel : PageModel
    {
        private readonly IMyDependency _myDependency;

        public IndexModel(IMyDependency myDependency)
        {
            this._myDependency = myDependency;
        }

        public void OnGet()
        {
                _myDependency.WriteMessage("IndexModel.OnGetAsync created this message.");

        }
  }

  下面是输出WriteMessage方法的日志信息:

  参考文献:

    Microsoft.NET 企业级应用 架构设计

    官方文档:ASP.NET Core 依赖注入

  

原文地址:https://www.cnblogs.com/MrHSR/p/10227591.html

时间: 2024-10-03 13:47:11

asp.net core 系列 3 依赖注入的相关文章

ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还对这个依赖注入系统底层的实现原理具有好奇心,可以继续阅读这一节的内容. 目录一.ServiceCallSite 二.Service 三.ServiceEntry 四.ServiceTable 五.ServiceProvider 作为DI容器的体现,ServiceProvider是ASP.NET Co

ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最终采用何种方式提供我们所需的服务实例取决于最终选择了怎样的ServiceCallSite,而服务注册是采用的ServiceDescriptor有决定了ServiceCallSite类型的选择.我们将众多不同类型的ServiceCallSite大体分成两组,一组用来创建最终的服务实例,另一类则与生命周

ASP.NET Core中的依赖注入(2):依赖注入(DI)

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/project-layout.html http://www.yuanjiaocheng.net/ASPNET-CORE/projectjson.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-configuration.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-middleware.htm

ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】

到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个ServiceProvider对象,何创建ServiceScope,以及如何提供一个服务实例的集合. 一.提供一个ServiceProvider对象 我们知道当将服务类型指定为IServiceProvider接口并调用ServiceProvider的GetService方法是,ServiceProvider对象本

ASP.NET Core 中的依赖注入 [共7篇]

一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了“标准化”,我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务.要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Control)… [

ASP.NET Core中的依赖注入(1):控制反转(IoC)

ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化",我们将这些标准化的组件称为服务,ASP.NET在内部专门维护了一个DI容器来提供所需的服务.要了解这个DI容器以及现实其中的服务提供机制,我们先得知道什么是DI(Dependence Injection),而一旦我们提到DI,又不得不说IoC(Inverse of Control). 目录 一.流程控

ASP.NET Core MVC 之依赖注入 Controller

ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系,在某些情况下,单个控制器地操作可能需要一个服务,在控制器级别上的请求可能没有意义.在这种情况下,也可以将服务作为  Action 的参数. 依赖注入是一种如 Dependency Inversion Principle 所示的技术,允许应用程序松散耦合的模块组成. 1.构造函数注入 ASP.NET Core 内置的基于构造函数的依赖注入支持扩展到 MVC 控制器.通过只添加一个服务类型作为构造函数参数到控制器中,AS

拥抱.NET Core系列:依赖注入(1)

依赖注入时编程手段中解耦和封装的一个非常重要的手段,我本人已经到了没有DI无法编写项目的程度了,在.NET Framework中微软并没有在FCL中引入DI,虽然推出了"Unity".而在.NET Core中DI几乎是所有组件的标配可见DI有多么的重要,本节主要简单介绍下微软在.NET Core中加入的DI组件. 前言 DIP.IoC.DI 说起DI不得不提IoC这个模式,很多人会把DI和IoC混为一谈,但其实这两者是概念和实现的关系. 依赖倒置原则(DIP):软件设计原则,要依赖于抽

ASP.NET CORE系列【一】搭建ASP.NET CORE项目

原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug太多,现在2.0也发布很久了,决定研究一下. ASP.NET Core官方文档https://docs.microsoft.com/en-us/aspnet/core/getting-started ASP.NET Core 具有如下优点: 生成 Web UI 和 Web API 的统一场景. 集成