通过Autofac的Mapster依赖项注入



根据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();
  1. 如何添加配置实例的singleton
  2. 不确定我是否正确添加了IMapper-ServiceMapper配置,以及InstancePerHttpRequest是否等效于AddScoped
  1. 如何添加config实例的singleton

通常,您可以使用fluent方法SingleInstance()将服务注册为singleton,例如:

builder.RegisterType<MySingleton>().SingleInstance();

每个依赖MySingleton的组件都将获得相同的实例。但是,在您的情况下,没有必要告诉Autofac使用单个实例,因为您在没有Autofac(var config = new TypeAdapterConfig();(帮助的情况下自己创建实例。只需注册这一个实例,Autofac就别无选择,只能将其注入任何需要的地方:

builder.RegisterInstance(config);
  1. 不确定我是否正确添加了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请求提供了一个特定的唯一标签:

每个请求的实例通过提供众所周知的生存期范围标记、注册便利方法以及常见应用程序类型的集成,构建在每个匹配生存期范围的实例之上。不过,在幕后,它仍然只是每个匹配生存期范围的实例。

相关内容

  • 没有找到相关文章

最新更新