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


免責聲明!

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



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