.NET Core下自帶容器IServiceCollection以及AutoFac以及AutoFac中AOP簡介

来源:https://www.cnblogs.com/taotaozhuanyong/archive/2019/09/21/11562184.html
-Advertisement-
Play Games

https://www.cnblogs.com/artech/p/net-core-di-01.html 大內老A的在.NET Core下對這些的介紹,有一系列文章 https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html https://w ...


https://www.cnblogs.com/artech/p/net-core-di-01.html 大內老A的在.NET Core下對這些的介紹,有一系列文章

https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html

https://www.cnblogs.com/artech/p/dependency-injection-in-asp-net-core.html

https://www.zybuluo.com/dasajia2lang/note/1481011

下麵開始

在上一篇的筆記中,在.NET Freamwork中,有一個第三方容器Unity,可以實現註入,但是在.NET Core裡面,有一個IServiceCollection,這個是.NET Core框架自帶的一個容器,和Unity很相似,都是個容器。

下麵我們新建一個控制台程式,在控制台程式中,對IServiceCollection的使用做介紹。

下麵代碼,是本次實例中需要註入的類型,需要用的倒是再點開來看吧

namespace Bingle.Core.Interface
{
    public interface ITestServiceA
    {
        void Show();
    }
}
namespace Bingle.Core.Service
{
    public class TestServiceA : ITestServiceA
    {
        public void Show()
        {
            Console.WriteLine("A123456");
        }
    }
}

namespace Bingle.Core.Interface
{
    public interface ITestServiceB
    {
        void Show();
    }
}

namespace Bingle.Core.Service
{
    public class TestServiceB : ITestServiceB
    {
        
        public TestServiceB(ITestServiceA iTestService)
        {
          
        }


        public void Show()
        { 
            Console.WriteLine($"This is TestServiceB B123456");
        }
    }
}


namespace Bingle.Core.Interface
{
    public interface ITestServiceC
    {
        void Show();
    }
}

namespace Bingle.Core.Service
{
    public class TestServiceC : ITestServiceC
    {
        public TestServiceC(ITestServiceB iTestServiceB)
        {
        }
        public void Show()
        {
            Console.WriteLine("C123456");
        }
    }
}

namespace Bingle.Core.Interface
{
    public interface ITestServiceD
    {
        void Show();
    }
}

namespace Bingle.Core.Service
{
    public class TestServiceD : ITestServiceD
    {
        public void Show()
        {
            Console.WriteLine("D123456");
        }
    }
}
View Code

需要通過Nuget包,把IServiceCollection依賴的dll文件進入進來

Microsoft.Extensions.DependencyInjection

使用容器的三部曲:實例化一個容器、註冊、獲取服務

 IServiceCollection container = new ServiceCollection();
 // IServiceCollection
 container.AddTransient<ITestServiceA, TestServiceA>();  // 瞬時生命周期  每一次獲取的對象都是新的對象
 container.AddSingleton<ITestServiceB, TestServiceB>(); // 單例生命周期  在容器中永遠只有當前這一個
 container.AddScoped<ITestServiceC, TestServiceC>();    //當前請求作用域內  只有當前這個實例

 container.AddSingleton<ITestServiceD>(new TestServiceD());  // 也是單例生命周期

 ServiceProvider provider = container.BuildServiceProvider();

 ITestServiceA testA = provider.GetService<ITestServiceA>();
 ITestServiceA testA1 = provider.GetService<ITestServiceA>();
 Console.WriteLine(object.ReferenceEquals(testA, testA1));

 ITestServiceB testB = provider.GetService<ITestServiceB>();
 ITestServiceB testB1 = provider.GetService<ITestServiceB>();
 Console.WriteLine(object.ReferenceEquals(testB, testB1));
  
 ITestServiceC testC = provider.GetService<ITestServiceC>();
 ITestServiceC testC1 = provider.GetService<ITestServiceC>();
 Console.WriteLine(object.ReferenceEquals(testC, testC1));
  
 IServiceScope scope = provider.CreateScope();
 ITestServiceC testc3 = provider.GetService<ITestServiceC>();
 var testc4 = scope.ServiceProvider.GetService<ITestServiceC>();
 Console.WriteLine(object.ReferenceEquals(testc3, testc4));
  
 ITestServiceD testD = provider.GetService<ITestServiceD>();
 ITestServiceD testD1 = provider.GetService<ITestServiceD>();
 Console.WriteLine(object.ReferenceEquals(testD, testD1));

 

AutoFac也是個容器,下麵在Core中把AutoFac整合進來。

1、在Nuget中添加AutoFac

 

 2、ConfigureService需要一個返回值,IServiceProvider(在.NET Core3.0中不需要替換)

 

 

 3、實例化一個容器:

ContainerBuilder containerbuilder = new ContainerBuilder();

4、註冊服務,自定義一個類型,繼承Module,並重寫Load方法:

public class CustomAutofacModule:Module
{ 
    /// <summary>
    ///  當前這Module 專用做服務註冊
    /// </summary>
    /// <param name="builder"></param>
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<TestServiceA>().As<ITestServiceA>().SingleInstance();
        builder.RegisterType<TestServiceB>().As<ITestServiceB>().SingleInstance();
        builder.RegisterType<TestServiceC>().As<ITestServiceC>().SingleInstance();
        builder.RegisterType<TestServiceD>().As<ITestServiceD>().SingleInstance();
    }
}

在Startup.cs中的ConfigureServices()方法中加上一下代碼:

// services 預設的註冊服務,還需要處理控制器實例相關的的工作。 
containerbuilder.Populate(services); // autofac 全權接管了之前這個Service的所有工作

containerbuilder.RegisterModule<CustomAutofacModule>();
IContainer container = containerbuilder.Build();
return new AutofacServiceProvider(container);

AutoFac支持AOP

 AOP存在的意義,是在這個方法執行之前做什麼事,做完這個方法之後,又做什麼事。

1、安裝nuget包,DynamicProxy

 

 2、自定義一個類,繼承IInterceptor介面

 public class CustomAutofacAOP : IInterceptor
 {
     public void Intercept(IInvocation invocation)
     {
         Console.WriteLine($"method is {invocation.Method.Name}");
         Console.WriteLine($"Arguments is {string.Join(';', invocation.Arguments)}");

         invocation.Proceed();// 這裡表示繼續執行,就去執行之前應該執行的動作了

         Console.WriteLine("**************");

     }
 }

在之前的CustomAutofacModule也要稍作修改:

 

 

 添加兩個測試類:

 

 public interface IA
 {
     void Show();
 }

 [Intercept(typeof(CustomAutofacAOP))]
 public class A : IA
 {
     public void Show()
     {
         Console.WriteLine("Cm");
     }
 }

 

 

 

 在一個控制器下,通過構造函數的方式來實現註入:

 public class BingleController : Controller
 {
     private ILoggerFactory _factory = null;
     private ILogger<SecondController> _ilogger = null;

     private ITestServiceA _testServiceA = null;
     private ITestServiceB _testServiceB = null;
     private ITestServiceC _testServiceC = null;
     private ITestServiceD _testServiceD = null;
     private IA _a = null;

     public BingleController(ILoggerFactory factory, ILogger<SecondController> ilogger,
       ITestServiceA testServiceA,
       ITestServiceB testServiceB,
       ITestServiceC testServiceC,
       ITestServiceD testServiceD,
       IA a)
     {
         _factory = factory;
         _ilogger = ilogger;
         _testServiceA = testServiceA;
         _testServiceB = testServiceB;
         _testServiceC = testServiceC;
         _testServiceD = testServiceD;
         _a = a;
     }

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一次接觸到Cache的時候,是在WebForm中,第一次接觸,我就再也沒能忘記,cache(擦車,的拼音) 客戶端瀏覽器緩存https://blog.csdn.net/y874961524/article/details/61419716 CDN緩存原理https://www.cnblogs.co ...
  • 因為有時候需要定製化的控制項,需要多個控制項的組合及複雜功能的集成,這樣可以考慮自定義用戶控制項。下麵分享一個簡單的數值增減功能的自定義控制項作為說明。 效果圖如下: 1、創建自定義用戶控制項(添加->新建項->用戶控制項) 2、編寫XAML UI比較簡單,我就不解釋了... 2、編寫後臺代碼 邏輯也比較簡單, ...
  • WPF依賴項屬性可以實現屬性的綁定,成功綁定之後只要修改後臺綁定的屬性,即可UI同步自動更新綁定的值,無需手動刷新界面;同樣,前臺的值變化後,通過獲取綁定的屬性值也可獲取UI變化後的值,實現雙向變化的效果。屬性綁定使得UI更新非常的方便,下麵分享一個小慄子說明使用的方式。 1、先做了一個有一個Tex ...
  • JIT--第一次--標記已--存根--調用--查找存根--執行機器碼 C#和CIL的關係: C#和N#都是CIL實現,但是彼此不能互通: C#和N#公開不分滿足規範,我們才能互通 CLS就是描述多語言互通的規範 記憶體分配:線程棧 堆Heap: 一個程式運行時,該進程存放引用類型變數的一塊記憶體,全局唯 ...
  • 參考地址:https://blog.csdn.net/qiaoquan3/article/details/51380992 1、集合set:純粹的數據集合 2、線性結構:一對一的,數組 3、樹形結構:一對多的,菜單/文件夾/類別/屬性控制項/表達式目錄樹 4、圖形/網狀結構:多對多,地圖應用比較多,網 ...
  • 需求場景 網站a,功能變數名稱為 a.site.com 網站b, 功能變數名稱為 b.site.com 需要在a、b兩個站點之間共用session 解決方案 使用redis作為分散式緩存存儲 設置sessionId cookie 保存的功能變數名稱,使得兩個網站鈞能夠讀取到相同的sessionId 自定義SessionMi ...
  • https://www.cnblogs.com/chenwolong/p/7531955.html EF使用AsNoTracking(),無跟蹤查詢技術(查詢出來的數據不可以修改,如果你做了修改,你會發現修改並不成功) ...
  • 表達式樹練習實踐:入門基礎 [TOC] 什麼是表達式樹 來自微軟官方文檔的定義: 表達式樹以樹形數據結構表示代碼。 它能幹什麼呢? 你可以對錶達式樹中的代碼進行編輯和運算。 這樣能夠動態修改可執行代碼、在不同資料庫中執行 LINQ 查詢以及創建動態查詢。 好不好玩? 表達式樹還能用於動態語言運行時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...