根据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); <- Not sure what is the equivalent of this line in Autofac?
//services.AddScoped<IMapper, ServiceMapper>();
// Not sure if the following is correct? Is AddScoped the same as InstancePerHttpRequest?
builder.RegisterType<MapsterMapper.ServiceMapper>()
.As<MapsterMapper.IMapper>()
.InstancePerHttpRequest();
- 如何添加配置实例的singleton
- 不确定我是否正确添加了IMapper-ServiceMapper配置,以及InstancePerHttpRequest是否等效于AddScoped
- 如何添加
config
实例的singleton
通常,您可以使用fluent方法SingleInstance()
将服务注册为singleton,例如:
builder.RegisterType<MySingleton>().SingleInstance();
每个依赖MySingleton
的组件都将获得相同的实例。但是,在您的情况下,没有必要告诉Autofac使用单个实例,因为您在没有Autofac(var config = new TypeAdapterConfig();
(帮助的情况下自己创建实例。只需注册这一个实例,Autofac就别无选择,只能将其注入任何需要的地方:
builder.RegisterInstance(config);
- 不确定我是否正确添加了
IMapper
-ServiceMapper
配置
是的,这样应该可以正常工作。
。。。如果CCD_ 7等价于CCD_?
基本上是的,但不是完全。
将功能从Microsoft.Extensions.DependencyInjection
映射到Autofac并不容易。Autofac提供了一个名为寿命范围的概念。它允许您注册在特定作用域的生命周期内唯一的组件,并且在该作用域结束后不会使用(因此名称lifetime(:
builder.RegisterType<MyComponent>().InstancePerLifetimeScope();
无论你想到什么终身概念,你都可以创建终身范围。在web应用程序框架的世界中,最常见的生存期概念是请求的概念,因此您可以为每个请求创建一个新的生存期范围。事实上,各个框架的Autofac集成正是这样工作的,所以您不必自己创建生存期范围。
只要您的应用程序域中只有一个生存期概念,这就可以很好地工作。一旦开始在其他生存期范围内创建生存期范围,就无法定义组件应在哪个生存期范围中是唯一的。这就是为什么Autofac支持对生存期作用域进行标记的原因。通过这种方式,您可以注册一个组件,使其仅对具有特定标签的生存期作用域是唯一的:
builder.RegisterType<MyComponent>().InstancePerMatchingLifetimeScope("MyScope");
现在,对于使用标记"MyScope"
创建的每个生存期作用域,将使用MyComponent
的新实例,但其他生存期作用域名可共享相同实例。正如您在Autofac文档中所读到的,InstancePerHttpRequest()
只是InstancePerMatchingLifetimeScope
的一种方便方法,它为HTTP请求提供了一个特定的唯一标签:
每个请求的实例通过提供众所周知的生存期范围标记、注册便利方法以及常见应用程序类型的集成,构建在每个匹配生存期范围的实例之上。不过,在幕后,它仍然只是每个匹配生存期范围的实例。