150行程式碼打造.net core生產力工具,你值得擁有
你是否在初學 .net core時,被依賴注入所折磨?
你是否在開發過程中,為了注入依賴而不停的在Startup中增加註入程式碼,而感到麻煩?
你是否考慮過或尋找過能輕鬆實現自動注入的元件?
如果有,那請歡迎繼續往下看。
或許你是被我這標題給吸引過來的,請不要懷疑自己的眼睛,如果你真的遇到過以上的問題,那我相信我的分享能幫助到你。
再次宣告,我不是標題黨。
閒話少說,此元件已經在我們公司內部使用半年有餘,雖然程式碼不多,但也確確實實為公司同事解決些許麻煩事。為了響應公司開源的號召,所以決定將此元件開源。
在沒有此工具之前,相信大多數使用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