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