首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Autofac的Mapster依赖注入

基于Autofac的Mapster依赖注入
EN

Stack Overflow用户
提问于 2021-05-18 20:03:15
回答 1查看 688关注 0票数 2

根据Mapster文档https://github.com/MapsterMapper/Mapster/wiki/Dependency-Injection,我应该做以下工作:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    ...
    var config = new TypeAdapterConfig();
    services.AddSingleton(config);
    services.AddScoped<IMapper, ServiceMapper>();
    ...
}

下面是我使用Autofac在MVC 4应用程序中添加上述配置的尝试:

代码语言:javascript
复制
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?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 21:27:24

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

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

代码语言:javascript
复制
builder.RegisterType<MySingleton>().SingleInstance();

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

代码语言:javascript
复制
builder.RegisterInstance(config);

  1. 不确定我是否正确地添加了IMapper - ServiceMapper配置.

是的,这样会很好的。

..。如果InstancePerHttpRequest等同于AddScoped呢?

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

将功能从Microsoft.Extensions.DependencyInjection映射到Autofac并不那么容易。Autofac附带了一个称为生存期范围的概念。它允许您注册组件,这些组件在特定作用域的生命周期中是唯一的,并且在该作用域结束后不会被使用(因此,名称生存期):

代码语言:javascript
复制
builder.RegisterType<MyComponent>().InstancePerLifetimeScope();

您可以为脑海中出现的任何生命周期概念创建终身作用域。在web应用程序框架中,最常见的生命周期概念是请求的概念,因此您可以为每个请求创建一个新的生存期范围。实际上,各个框架的Autofac集成就是这样工作的,所以您不必自己创建生存期范围。

只要您的应用程序域中只有一个生命周期概念,这就很好了。一旦开始在其他生存期作用域中创建生存期作用域,就无法定义组件应该是唯一的生存期作用域。这就是为什么Autofac支持对生存期作用域进行标记。通过这种方式,您可以注册一个组件,使其仅对于具有特定标记的生存期作用域是唯一的:

代码语言:javascript
复制
builder.RegisterType<MyComponent>().InstancePerMatchingLifetimeScope("MyScope");

现在,对于使用标记"MyScope"创建的每个生存期作用域,将使用一个新的MyComponent实例,但其他生存期作用域可能共享相同的实例。正如您可以在Autofac文档中阅读的那样,InstancePerHttpRequest()只是InstancePerMatchingLifetimeScope的一种方便方法,它为HTTP请求提供了一个特定的唯一标记:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67593227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档