4

有谁知道使用 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 实例,但我不确定如何处理?

4

1 回答 1

10

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

如果需要,可以从类中获取一些代码Mapper注册组件,如下所示:

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);
           }
       });

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

于 2013-02-03T19:37:36.677 回答