.net core 批量注入(自帶DI,AutoFac)


前言

.net core自帶DI(包括Autofac)的常規用法:每寫一個接口就需要注冊一次,以備在使用時自動注入實例。
在寫常規代碼時這樣重復的步驟過於繁瑣,這里介紹在切面層一勞永逸的做法。

1、.net core 自帶DI(屬性的形式定義聲明周期)

  步驟一:添加屬性,並含有生命周期的參數;

  步驟二:給接口實現類添加該屬性,並定義生命周期; 

 

  步驟三:在ConfigureServices中利用反射找到所有的類,並根據屬性定義的生命周期來注冊;

 

2、.net core 自帶DI(接口的形式定義聲明周期)

  步驟一:添加三個空接口,代表三種生命周期;

  

  步驟二:實現類繼承所需生命周期的接口;  

 

  步驟三:在ConfigureServices中利用反射找到所有的類,並根據實現類所繼承的接口代表的生命周期來注冊;

 

  

 3、Autofac
  
步驟一:引入包Autofac.Extensions.DependencyInjection,並初始化Autofac;

  步驟二:添加ConfigureContainer方法,它會在Configure方法執行后執行,這里是通過屬性的形式定義聲明周期來注冊;(屬性定義如上,也可用接口的形式如上)

 

   

總結:
1)上述三種做法都能在切面層做到批量注入,做到最少的侵入代碼;
2)之所以采用定義屬性或者接口的方式,是為了更好的定義生命周期,如果項目中只需要一種生命周期的話,可以連屬性和接口都不用,直接使用某一種生命周期(Autofac默認是Transient);
3)利用反射取所有類型時,用的是AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()),如果是多項目分層的話要替換成Assembly.GetEntryAssembly().GetReferencedAssemblies().Select(Assembly.Load).SelectMany(x => x.DefinedTypes);
參考:https://stackoverflow.com/questions/42524704/asp-net-core-find-all-class-types-in-all-assemblies
4)Autofac相對.net core自帶DI來說還能帶來更多便利,參考上述截圖中的ConfigureContainer方法里注釋掉的地方,還可與Castle結合起來用,在下一篇.net core 批量攔截器中會詳細講到;
5)使用的環境是.net core 3.x,由於Autofac每個版本的寫法有一些變化,建議先對照一下版本后使用對應的寫法;


免責聲明!

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



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