【问题标题】:Autofac 3 and AutomapperAutofac 3 和 Automapper
【发布时间】:2013-01-30 23:10:30
【问题描述】:

有谁知道使用 Autofac 设置 Automapper 的综合指南。我对这两者都很陌生,但我已经玩过静态 Mapper 类,但是我希望能够模拟和注入 IMappingEngine 并创建一个配置来设置我的所有映射。到目前为止,我看过的所有指南都没有真正解释发生了什么,我也无法弄清楚。另外我正在使用 Autofac 3.0,它似乎在 ContainerBuilder 方法中存在一些差异,这无济于事(我使用它的原因是 Autofac.mvc4 依赖于它)。

更新:

好的,最简单的解决方案似乎运行良好,但是我在互联网上的任何地方都没有看到它,这可能是我不知道的一个很好的理由?最简单的做法就是将静态 Mapper.Engine 注册为 IMappingEngine 并仍然使用静态 Mapper.CreateMap 进行配置。

var builder = new ContainerBuilder();
builder.Register<IMappingEngine>(c => Mapper.Engine);

现在 Autofac 可以将 IMappingEngine 注入到您的构造函数中。这确实意味着 Mapper 将处理 IMappingEngine 单例而不是 Autofac,而 Autofac 只是充当它的包装器。我希望 Autofac 处理 IMappingEngine 实例,但我不确定如何处理?

【问题讨论】:

标签: automapper autofac


【解决方案1】:

只要您不想在单元测试中模拟映射器或为嵌套生命周期范围创建具有修改配置的映射器,您的简单解决方案就可以了(后一个对我来说看起来有点奇怪,但谁知道)。

如果您需要,可以从the Mapper class 中获取一些代码,然后像这样注册组件:

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
       .AsImplementedInterfaces()
       .SingleInstance();

builder.RegisterType<MappingEngine>()
       .As<IMappingEngine>();

我不确定您是否真的需要将IMappingEngine 设为单例。创建每个依赖项应该非常轻量级。

现在你可以像这样使用它了:

// in a bootstrapper:
var mapperConfig = ctx.Resolve<IConfiguration>();
mapperConfig.CreateMap<A, B>();

// later on:
public class X{
    IMappingEngine _mapper;

    public X(IMappingEngine mapper){
        _mapper = mapper;
    }

    public B DoSmth(){
        return _mapper.Map<B>(new A());
    }
}

您还可以像这样设置自动配置文件注册:

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
       .AsImplementedInterfaces()
       .SingleInstance()
       .OnActivating(x => {
           foreach (var profile in x.Context.Resolve<IEnumerable<Profile>>()){
               x.Instance.AddProfile(profile);
           }
       });

然后只需在 Autofac 配置或模块中的任何位置注册 Profile 实现,即可将其连接到配置。

【讨论】:

  • 正是我在感谢之后的答案类型。我不确定我什么时候会使用配置文件,但这是另一个问题 :)
  • Profile 的代码是什么样的?你会使用静态 Mapper.CreateMap 还是注入配置然后 createMap?我在让注入工作时遇到问题(循环依赖)。
  • 这对我不起作用..我没有 MapperRegistry.AllMappers(),但我认为 MapperRegistry.Mappers 是相同的。似乎没问题,但在第一次调用 _mapper.Map 时会失败,并显示“缺少类型映射配置或不支持的映射”.....
  • @punkologist,也许最新版本对 API 进行了更改。您应该查看 automapper 源以了解它现在是如何工作的。我已经有一段时间没有使用 automapper 或 autofac 了。
  • 谢谢我确实发现了这个问题。在我的配置文件中,我有 Mapper.CreateMap(没有 IOC 也可以),但只需将其更改为 this.CreateMap,现在效果很好。
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
相关资源
最近更新 更多