你是否在初學 .net core時,被依賴注入所折磨?git
你是否在開發過程當中,爲了注入依賴而不停的在Startup中增長注入代碼,而感到麻煩?程序員
你是否考慮過或尋找過能輕鬆實現自動注入的組件?github
若是有,那請歡迎繼續往下看。工具
或許你是被我這標題給吸引過來的,請不要懷疑本身的眼睛,若是你真的遇到過以上的問題,那我相信個人分享能幫助到你。.net
再次聲明,我不是標題黨。code
閒話少說,此組件已經在咱們公司內部使用半年有餘,雖然代碼很少,但也確確實實爲公司同事解決些許麻煩事。爲了響應公司開源的號召,因此決定將此組件開源。繼承
在沒有此工具以前,相信大多數使用core的程序員都是使用以下方式注入依賴的:接口
services.AddTransient<IStudentRepository, StudentRepository>(); services.AddTransient<IGroupRepository, GroupRepository>(); services.AddTransient<ISchoolRepository, SchoolRepository>(); ..... ..... ..... ..... 此處省略若干行
但在項目的開發過程當中,須要依賴注入的類存在頻繁變更的狀況,而時常會出現寫了實體以及對應的接口後,而忘記添加註入代碼狀況。此狀況不但增長了開發人員的重複而無心義的工做量,也可能會致使出現一些無謂的bug。生命週期
從上面的代碼中咱們能夠發現,每一行的代碼都很是類似,都是把一個接口和實現類注入到系統中,並設置生命週期爲Transient,關於依賴注入相關的知識若是有不瞭解的,能夠參考博客園中其餘大神的講解,這不是我這篇文章的重點。開發
那既然代碼很是類似,那麼咱們就應該能夠想辦法封裝一下,讓代碼去實現自動注入,至此,AutoDI組件應運而生。
使用AutoDI組件的方法以下:
首先,定義一個接口,示例以下:
public interface IStudentServices : IScopedAutoDIable { int GetId(); }
其次,定義接口的實現類:
public class StudentServices : IStudentServices { public int GetId() { return 1; } }
細心的朋友應該已經發現了,我上面代碼的IStudentServices接口繼承了IScopedAutoDIable,從字面意思應該就能看出這個接口是作什麼。
注:接口和實現類的命名規則須要知足接口爲Ixxx,類名爲xxx的格式。
什麼?看不懂英文?那好吧,我解釋下吧,使用了AutoDI的項目在啓動的時候,或自動搜索程序集中繼承了IScopedAutoDIable的接口或類,找到後,會調用TryAddScoped方法將接口或類注入到系統中。同理,若是想將注入的生命週期改成瞬時的或者單例的,那隻須要分別繼承ITransientAutoDIable和ISingletonAutoDIable類便可。
最後,也是最重要的一步,在Startup類ConfigureServices方法中,寫入以下代碼:
services.AutoDI();
以上代碼將會遍歷程序所引用的全部程序集中繼承了IAutoDIable接口的接口或類,而後實現自動注入。
固然了,有比較較真的或對代碼有潔癖的人,可能會說,我不想遍歷全部的程序集,這樣會影響程序的啓動速度。那咱也是有辦法知足的,你只需在調用AutoDI接口時,將須要遍歷的程序集指定便可。示例代碼以下:
services.AutoDI(typeof(IAutoDIEntity).Assembly);
上述的代碼中,程序將在IAutoDIEntity接口所在的類庫中遍歷繼承了IAutoDIable接口的接口或類。這裏寫的IAutoDIEntity只是輔助獲取程序集的接口,並沒有實際意義,你也能夠換成你想遍歷的程序集的任意的類或者接口。
到這裏,或許仍是會有人說,這還不能知足個人要求,個人接口和類已經繼承了IXXXX接口了,我不想繼承你定義的IAutoDIable這幾個相關的接口,我想繼承我自定義的接口。我只能說。。。。
能夠,你想幹嗎均可以。
以下所示:
services.AutoDI<IXXXX>();
到這裏,此組件的使用方式已經描述完畢,有不清楚的小夥伴能夠想辦法與我聯繫。具體怎麼聯繫,隨你。反正我也不會搭理大家的。O(∩_∩)O哈哈~
不過,若是你在github上給我點了star的話,我或許能夠考慮翻下你的牌子。
最後留下源碼git地址:
https://github.com/billsking/WeShare.AutoDI
nuget請搜索:WeShare.AutoDI
再最後,發個武漢 .net 召集令
目前各地.net俱樂部活動作了一期又一期,咱們大武漢居然一場活動都沒作過,筆者很是着急,很是想爲社區貢獻一份力量,因此想籌備2020年武漢.net俱樂部活動,目前已經準備了一些分享資料,預計2020年3月或者4月舉辦第一期線下活動。若是您有場地支持,有好的經驗分享或者一些好的想法,請必定要留言告訴我,期待咱們武漢的第一次活動能順利舉行。
點擊連接加入羣聊【武漢.Net微軟技術俱樂部】:https://jq.qq.com/?_wv=1027&k=5YbyGhL