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 依賴注入

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM