按照Mapster的檔案,https://github.com/MapsterMapper/Mapster/wiki/Dependency-Injection 我應該做的是:
public void ConfigureServices(IServiceCollection services)
{
...
var config = new TypeAdapterConfig()。
services.AddSingleton(config);
services.AddScoped<IMapper, ServiceMapper>()。
...
}
以下是我使用Autofac在我們的MVC 4應用程式中添加上述配置的嘗試:
public static void RegisterDependencies()
{
var builder = new ContainerBuilder()。
...
var config = new TypeAdapterConfig() 。
//services.AddSingleton(config); <- 不知道這一行在Autofac中相當于什么?。
//services.AddScoped<IMapper, ServiceMapper> ();
//不確定以下內容是否正確?AddScoped是否與InstancePerHttpRequest相同?
builder.RegisterType<MapsterMapper.ServiceMapper>()
.As<MapsterMapper.IMapper>()
.InstancePerHttpRequest()。
- 如何添加配置實體的單子?
- 不確定我是否正確添加了 IMapper - ServiceMapper 配置,以及 InstancePerHttpRequest 是否等同于 AddScoped?
uj5u.com熱心網友回復:
- 如何添加
config實體的單子?
一般來說,你可以使用流暢的方法SingleInstance()將服務注冊為單子,例如:
builder.RegisterType<MySingleton>().SingleInstance()。
每個對MySingleton有依賴關系的組件將得到相同的實體傳遞。然而,在你的例子中,沒有必要告訴Autofac使用一個單一的實體,因為你在沒有Autofac的幫助下自己創建了這個實體(var config = new TypeAdapterConfig();)。只需注冊這一個實體,Autofac就會在需要它的地方注入它,別無選擇:
builder.RegisterInstance(config)。
- 不確定我是否正確添加了
IMapper-ServiceMapper配置...
是的,這樣做應該沒問題。
...如果InstancePerHttpRequest等同于AddScoped?
嗯,基本上是的,但不完全是。
它不是那么容易的。
將 Microsoft.Extensions.DependencyInjection 的功能映射到 Autofac 并非那么容易。Autofac帶有一個叫做lifetime scopes的概念。它允許你注冊一些組件,這些組件在特定范圍內是唯一的,一旦這個范圍結束就不會再使用(因此被稱為lifetime):
builder.RegisterType<MyComponent>().InstancePerLifetimeScope()。
你可以為你腦海中出現的任何生命周期概念創建生命周期作用域。在Web應用框架的世界里,最常見的生命周期概念是請求的概念,所以你可以為每個請求創建一個新的生命周期作用域。事實上,各個框架的 Autofac 集成正是以這種方式作業的,因此您不必自行創建生命周期作用域。
只要您的應用域中只有一個生命周期概念,這種方式就能正常作業。一旦你開始在其他生命周期作用域中創建生命周期作用域,你就無法定義一個組件應該在哪個生命周期作用域中是唯一的。這就是為什么Autofac支持對生命周期作用域進行標記。通過這種方式,你可以注冊一個組件,使其只對具有特定標簽的終生作用域是唯一的:
builder.RegisterType<MyComponent>().InstancePerMatchingLifetimeScope("MyScope"/span>)。
現在,對于每個使用標簽"MyScope"創建的生命周期作用域,將使用一個新的MyComponent的實體,但其他生命周期作用域可能共享同一個實體。正如你可以在Autofac檔案中讀到的,InstancePerHttpRequest()只是InstancePerMatchingLifetimeScope的一個方便方法,有一個特定的唯一標簽用于HTTP請求:
Instance per request通過提供一個眾所周知的生命周期范圍標簽、一個注冊便利方法以及對常見應用程式型別的整合,建立在每個匹配生命周期范圍的實體之上。但在幕后,它仍然只是每個匹配的生命周期范圍的實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319277.html
標籤:
