有谁知道使用Autofac设置自动映射器的综合指南。 我是这两个方面的新手,但我已经尝试了静态映射器类,但是我希望能够模拟和注入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实例,但我不确定如何?
只要您不想在单元测试中模拟映射器或使用嵌套生存期范围的修改配置创建映射器(后者对我来说看起来有点奇怪,但谁知道呢)。
如果需要,可以从 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);
}
});
然后,只需在 Autofac 配置或模块中的任何位置注册Profile
实现,即可将其连接到配置。