shm*_*111 4 autofac automapper
有没有人知道使用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);
Run Code Online (Sandbox Code Playgroud)
现在,Autofac可以将IMappingEngine注入到构造函数中.这意味着Mapper将处理IMappingEngine单例而不是Autofac,而Autofac只是作为它的包装器.我想Autofac处理IMappingEngine实例,但我不确定如何?
Pav*_*lov 10
如果您不想在单元测试中模拟映射器或者为嵌套生命周期范围创建具有已修改配置的映射器,那么您的简单解决方案就可以了(后者对我来说看起来有点奇怪,但谁知道).
如果你需要,你可以拿起从一些代码片段的Mapper类和这样注册的组件:
builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()))
.AsImplementedInterfaces()
.SingleInstance();
builder.RegisterType<MappingEngine>()
.As<IMappingEngine>();
Run Code Online (Sandbox Code Playgroud)
我不确定你是否真的需要制作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());
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以设置自动配置文件注册,如下所示:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
然后只需Profile在Autofac配置或模块中的任何位置注册实现,以使其连接到配置.
| 归档时间: |
|
| 查看次数: |
5182 次 |
| 最近记录: |