1

根据 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. 如何添加配置实例的单例?
  2. 不确定我是否正确添加了 IMapper - ServiceMapper 配置以及 InstancePerHttpRequest 是否等同于 AddScoped?
4

1 回答 1

2
  1. 如何添加单例config实例?

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

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

每个具有依赖关系的组件MySingleton都将获得相同的实例传递。但是,在您的情况下,无需告诉 Autofac 使用单个实例,因为您自己创建实例而无需 Autofac ( var config = new TypeAdapterConfig();) 的帮助。只需注册这个实例,Autofac 除了在需要的地方注入它之外别无选择:

builder.RegisterInstance(config);
  1. 不确定我是否添加了IMapper-ServiceMapper配置正确...

是的,它应该以这种方式正常工作。

...如果InstancePerHttpRequest相当于AddScoped

嗯,基本上是的,但不完全是。

将功能映射Microsoft.Extensions.DependencyInjection到 Autofac 并不容易。Autofac 带有一个称为生命周期范围的概念。它允许您注册在特定范围内将是唯一的组件,并且在此范围结束后将不再使用(因此名称为生命周期):

builder.RegisterType<MyComponent>().InstancePerLifetimeScope();

您可以为您想到的任何生命周期概念创建生命周期范围。在 Web 应用程序框架的世界中,最常见的生命周期概念是请求的概念,因此您可以为每个请求创建一个新的生命周期范围。事实上,各个框架的 Autofac 集成正是以这种方式工作的,因此您不必自己创建生命周期范围。

只要您的应用程序域中只有一个生命周期概念,这就可以正常工作。一旦您开始在其他生命周期范围内创建生命周期范围,您就无法定义组件在哪个生命周期范围内应该是唯一的。这就是 Autofac 支持生命周期标记的原因。这样,您可以将组件注册为仅在具有特定标签的生命周期范围内是唯一的:

builder.RegisterType<MyComponent>().InstancePerMatchingLifetimeScope("MyScope");

现在,对于使用标签创建的每个生命周期范围,都将使用"MyScope"一个新的实例MyComponent,但其他生命周期范围可能共享同一个实例。正如您在Autofac 文档中所读到的,InstancePerHttpRequest()这只是一种InstancePerMatchingLifetimeScope为 HTTP 请求使用特定唯一标记的便捷方法:

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

于 2021-05-24T21:27:24.950 回答