欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core 系列 3 依赖注入

程序员文章站 2022-11-10 22:19:31
一. 依赖注入概述 在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在ASP.NET Core中的实现。 直接依赖是指:当一个类需要另一个类协作 ......

一. 依赖注入概述

  在软件设计的通用原则中,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方法的日志信息:

asp.net core 系列 3 依赖注入

 

   参考文献:

    microsoft.net 企业级应用 架构设计

    官方文档:asp.net core 依赖注入