Autofac 3和AutoMapper(Autofac 3 and Automapper)

2019-08-16 16:13发布

有谁知道一个全面的指导与Autofac建立Automapper。 我是新来的两个,但我打得四处静态映射器类,但是我希望能够嘲笑和注入IMappingEngine和创建,设置了我的所有映射的配置。 所有导游我已经看过至今没有真正解释是怎么回事,我不能完全解决它。 我也是使用Autofac 3.0里面好像有在ContainerBuilder方法不利于一些区别(我使用它的原因是Autofac.mvc4依赖于它)。

更新:

OK,最简单的解决方案似乎工作不够好,但我并没有在互联网上的任何地方看到它,也许一个很好的理由,我不知道吗? 做最简单的事情就是要注册静态Mapper.Engine为IMappingEngine并且仍然使用静态Mapper.CreateMap首先进行配置。

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

现在Autofac可以注入IMappingEngine到您的构造函数。 这是否意味着映射器将处理IMappingEngine单,而不是Autofac和Autofac只是充当它的包装。 我想Autofac处理IMappingEngine实例,但我不知道怎么办?

Answer 1:

你简单的解决方案确定前提是你不想嘲笑映射单元测试或者创建拥有嵌套寿命范围修改的配置映射器(后者看起来有点怪我,但谁知道)。

如果你需要,你可以从拿起一些代码块的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配置或模块中的任何地方得到它挂接到的配置。



文章来源: Autofac 3 and Automapper