亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

asp.net core 系列 3 依賴注入服務

標簽:
C#

一. 依赖注入概述

  在软件设计的通用原则中,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  

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消