Autofac 3和Automapper

时间:2013-01-30 23:10:30

标签: automapper autofac

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

1 个答案:

答案 0 :(得分:10)

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

如果您需要,可以从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实现,即可将其连接到配置。