日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net core依赖注入的封装

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net core依赖注入的封装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在流行的系統一般都采用依賴注入的實現方式,利用DI容器來直接獲取所用到的類/接口的實例。.net core也一樣采用DI的方式,提供了DI容器的接口IServiceCollection,并提供了基于該接口的缺省實現ServiceCollection。

這樣我們就可以不再像以前一樣,需要引入第三方的Untiy、Autofac、Castle等DI組件了。

在.net core源碼的ServiceCollectionExtensions的實現中,有三個注冊的方法AddScoped、AddSingleton、AddTransient。這其中的三個選項(Singleton、Scoped和Transient)體現三種對服務對象生命周期的控制形式。

  • Singleton:ServiceProvider創建的服務實例保存在作為根節點的ServiceProvider上,所有具有同一根節點的所有ServiceProvider提供的服務實例均是同一個對象。適合于單例模式。

  • Scoped:ServiceProvider創建的服務實例由自己保存,所以同一個ServiceProvider對象提供的服務實例均是同一個對象。 可以簡單的認為是每請求(Request)一個實例。

  • Transient:針對每一次服務提供請求,ServiceProvider總是創建一個新的服務實例。 每次訪問時被創建,適合輕量級的,無狀態的服務。

這個具體說起來就太多了,還是查閱相關材料吧J

?

有了DI容器,我們在使用時,可以簡單的在Startup.cs程序中編寫上注冊語句,下面以操作日志的倉儲類為例:

public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IOperLogRepository, OperLogRepository>();
}

?第一個泛型類型表示將要從容器中請求的類型(通常是一個接口)。第二個泛型類型表示將由容器實例化并且用于完成這些請求的具體類型。

?

我們在操作日志的邏輯服務類使用操作日志的倉儲時,就這樣寫:

public partial class OperLogAppService : IOperLogAppService
{
private IOperLogRepository service;
public OperLogAppService(IOperLogRepository service)
{
this.service = service;
}

public void Write(OperLogDto operLogDto)
{
this.service.Insert(operLogDto.AsInfo());
}
}

?系統會在創建OperLogAppService的實例時,會自動創建IOperLogRepository在DI容器中注冊OperLogRepository類的實例。

然而這種方式在框架中是有些不方便的。我們知道,框架要求的是可擴展,可配置,在新增系統功能模塊時,還需要手工修改程序,在Startup.cs的ConfiguraeService中增加注冊(就算把所有注冊移到一個獨立的方法中也是一樣),就如同第一個代碼寫的一樣,包括注冊倉儲類、注冊邏輯服務類等等。然后編譯,再發布運行。每增加、修改一個模塊,都需要整個系統編譯、發布,對運行中的系統影響還是挺大的。

我們的做法是,功能模塊都有一個自注冊的類。這個自注冊的類會將功能模塊中所有的倉儲類、邏輯服務類等都注冊進DI容器中。Startup.cs會自動查找所有功能模塊中的自注冊類,然后將相關內容注冊進DI容器中。這樣就可以做到,每增加一個模塊,只需要將該模塊的應用程序集Dll復制到系統的運行目錄就行了,其他的系統幫你搞定。

按照上述思路,首先是建一個自注冊的類。這個類都抽象出一個接口IServiceRegister

public interface IServiceRegister
{
/// <summary
/// 注冊
/// </summary>
void Register(IServiceCollection services);
}

?

我們以通用模塊為例子,自注冊的類應該是這樣的。

public class CommonServiceRegister : IServiceRegister
{
public void Register(IServiceCollection services)
{
services.AddDbContext<CommonDbContext>(option =>
option.UseDb<CommonDbContext>(services.BuildServiceProvider()),
ServiceLifetime.Scoped);
services.AddScoped<IParaReferRepository, ParaReferRepository>();
services.AddScoped<IParaReferAppService, ParaReferAppService>();
services.AddScoped<ISystemParameterRepository, SystemParameterRepository>();
services.AddScoped<ISystemParameterAppSer

這個類中service.AppScoped注冊的是倉儲層和邏輯層接口對應的實現類,我們這里只是列出了系統參數和引用參數的注冊。對于第一句AddDbContext,請參見:4.4 異構、多數據庫的存取組件

為了在Startup.cs中自己查找并調用這些注冊類,還是比較簡單的,程序如下:調用ReflectionHelper的GetSubTypes方法,獲取所有繼承IServiceRegister的實現類,對于每個實現類,創建實例并將模塊的倉儲和邏輯服務注冊到DI容器中。ReflectionHelper的GetSubTypes方法,請參見:4.1 反射工具

IEnumerable<Type> serviceList = ReflectionHelper.GetSubTypes<IServiceRegister>();
foreach (Type type in serviceList)
{
IServiceRegister register = ReflectionHelper.CreateInstance(type)
as IServiceRegister;
register.Register(services);

}

?

.net framework也可以按照上述思路進行,不同的就是.net framework沒有startup.cs,只需要將上面的內容寫進global.asax即可,還有一點不同是IServiceCollection,可以使用Unity等DI組件提供的DI容器。

原文地址:http://www.cnblogs.com/BenDan2002/p/6087893.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

總結

以上是生活随笔為你收集整理的.net core依赖注入的封装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。