我使用了第三方DLL,它在内部使用AutoMapper并使用AutoMapper.Initialize()进行初始化,但是根据我的理解,我不能在清除现有地图时调用Initialize()。
第三方使用AutoMapper而不与我自己的代码冲突的最佳解决方案是什么?
或者另一种方式..共享程序集应该如何设置自己使用AutoMapper来保证它自己的配置文件是初始化但允许该程序集的使用者初始化它自己的配置文件?
第三方程序集是否应该定义它的配置文件并依赖调用代码来初始化所有已启用的配置文件 - 从第三方组件手动添加配置文件?
我目前正在使用AutoMapper 5.1。
答案 0 :(得分:1)
执行此操作的最佳方法是不使用Mapper的静态实例 - 创建自己的实例,并使用依赖注入在任何需要使用AutoMapper的地方注入IMapper实例。这也使得测试代码变得更加容易。
这就是我使用autofac作为我的DI容器的方法:
builder.Register<IMapper>(c =>
{
var profiles = c.Resolve<IEnumerable<Profile>>();
var config = new MapperConfiguration(cfg =>
{
foreach (var profile in profiles)
{
cfg.AddProfile(profile);
}
});
return config.CreateMapper();
}).SingleInstance();
这样,每当我需要使用automapper时,我只需将它添加到我的构造函数中:
公共类MyClass { 私人只读IMapper _mapper;
public MyClass(IMapper mapper)
{
_mapper = mapper;
}
public void DoSomething()
{
var mapped = _mapper.Map<Dto>(....);
}
}