.NET平臺(tái)的一種方便快捷的服務(wù)注冊(cè)方案
前言
隨著dotnet的發(fā)展,DependencyInjection已經(jīng)成為基礎(chǔ)庫(kù)的一部分,現(xiàn)在我們的很多新型應(yīng)用程序很自然地應(yīng)用了DependencyInjection功能。應(yīng)用功能越多,往往服務(wù)類(lèi)型數(shù)量也隨著增加,如果依靠手寫(xiě)代碼一個(gè)服務(wù)一個(gè)服務(wù)地進(jìn)行注冊(cè)則非常麻煩。如果使用特性標(biāo)記服務(wù),在運(yùn)行時(shí)反射掃描服務(wù)并注冊(cè)服務(wù),不但會(huì)增加服務(wù)的啟動(dòng)時(shí)間,同時(shí)在AOT裁剪環(huán)境下服務(wù)類(lèi)型由于沒(méi)有顯式的被使用而編譯時(shí)默認(rèn)被裁剪掉,從而表現(xiàn)為沒(méi)有可注冊(cè)的服務(wù)。
方案設(shè)計(jì)
Annotation + SourceGenerator一種理解的方案,它仍然使用特性來(lái)標(biāo)記服務(wù),不同的是它在編譯時(shí)使用SourceGenerator技術(shù)收集程序集里標(biāo)記的服務(wù)類(lèi)型,然后在集程序集里增加向DependencyInjection注冊(cè)所有標(biāo)記的服務(wù)的擴(kuò)展方法代碼。
經(jīng)過(guò)SourceGenerator之后,和手寫(xiě)代碼一個(gè)服務(wù)一個(gè)服務(wù)的注冊(cè)的效果是完全一樣的,最終程序在運(yùn)行時(shí),不再需要反射程序集掃描服務(wù)類(lèi)型,啟動(dòng)速度會(huì)更快一丟丟。同時(shí)由于這些服務(wù)類(lèi)型都是顯式的被調(diào)用,所以也適用于AOT裁剪的項(xiàng)目環(huán)境,不再擔(dān)心服務(wù)類(lèi)型默認(rèn)被裁剪掉。
方案實(shí)現(xiàn)
DependencyInjection.Annotation 這是我對(duì)上述方案的一種實(shí)現(xiàn),它開(kāi)源在github上,支持一個(gè)實(shí)現(xiàn)對(duì)應(yīng)一種或(最)多(6)種服務(wù)類(lèi)型,使用方式也非常簡(jiǎn)單。
1 nuget引用
<PackageReference Include="DependencyInjection.Annotation" Version="1.0.0" />
2 服務(wù)標(biāo)記
// 服務(wù)類(lèi)型為MyService自身 [Service(ServiceLifetime.Singleton)] class MyService { }
// 服務(wù)類(lèi)型為IMyService1 [Service(ServiceLifetime.Singleton, typeof(IMyService1))] class MyService : IMyService1 { }
// 服務(wù)類(lèi)型為IMyService1和IMyService2 [Service(ServiceLifetime.Singleton, typeof(IMyService1), typeof(IMyService2))] class MyService : IMyService1, IMyService2, IDisposable { }
3 服務(wù)注冊(cè)
builder.Services.Add{AssemblyName}();
其中{AssemblyName}為包含服務(wù)的程序集名。
到此這篇關(guān)于.NET平臺(tái)的一種方便快捷的服務(wù)注冊(cè)方案的文章就介紹到這了,更多相關(guān).NET平臺(tái)服務(wù)注冊(cè)方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法
這篇文章主要介紹了C#實(shí)現(xiàn)復(fù)制文件夾中文件到另一個(gè)文件夾的方法,實(shí)例分析了C#實(shí)現(xiàn)文件夾的查找、判斷及文件復(fù)制相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07C#實(shí)現(xiàn)根據(jù)實(shí)體類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表
本文主要介紹了C#通過(guò)自定義特性實(shí)現(xiàn)根據(jù)實(shí)體類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表的方法。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12C#利用時(shí)間和隨即字符串創(chuàng)建唯一的訂單編號(hào)
本文介紹了利用時(shí)間和隨機(jī)字符串組合生成唯一訂單號(hào)的示例,從而保證訂單號(hào)不會(huì)重復(fù),希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2016-03-03快速解決owin返回json字符串多帶了雙引號(hào)"多了重string轉(zhuǎn)義字符串
下面小編就為大家?guī)?lái)一篇快速解決owin返回json字符串多帶了雙引號(hào)"多了重string轉(zhuǎn)義字符串。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08DevExpress SplitContainerControl用法總結(jié)
這篇文章主要介紹了DevExpress SplitContainerControl用法,對(duì)初學(xué)者有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-08-08C#操作本地文件及保存文件到數(shù)據(jù)庫(kù)的基本方法總結(jié)
C#使用System.IO中的文件操作方法在Windows系統(tǒng)中處理本地文件相當(dāng)順手,這里我們還總結(jié)了在Oracle中保存文件的方法,嗯,接下來(lái)就來(lái)看看整理的C#操作本地文件及保存文件到數(shù)據(jù)庫(kù)的基本方法總結(jié)2016-05-05FileShare枚舉的使用小結(jié)(文件讀寫(xiě)鎖)
其實(shí)/FileShare就是控制文件流的“訪問(wèn)權(quán)限”,當(dāng)然,這僅僅是入門(mén)的文件操作,自己做了筆記,也希望能給大家?guī)?lái)幫助2014-01-01最新評(píng)論