多项目解决方案中的多个AutoMapper配置

时间:2017-01-31 17:39:16

标签: c# .net automapper

所以问题很简单,但我无法找到解决问题的方法。

在我的解决方案中,我有一个DAL层(类库),一个DTO层(类库)和一个MVC项目。

这个想法是MVC应用程序从DTO层请求项目,而DTO层又从DAL层获取项目。很简单。

在DTO层中,我有一个存储库,其中包含用于管理它们的上下文。因此,MVC应用程序创建DTO上下文的实例,然后从适当的存储库中获取DTO实体。

现在出现问题。

在DTO图层中,我使用AutoMapper将底层实体映射到DTO,在MVC应用程序中,我计划再次使用它将DTO映射到ViewModel并返回。

因此,在DTO层的上下文的构造函数中,我调用静态RegisterMappings()来注册底层实体和DTO之间的映射。到目前为止没问题。

然而,在MVC应用程序的Global.asax中,当我尝试从ViewModel映射到MVC中的DTO时,我也调用RegisterMappings()(从不同的类到DTO层中的类) app我得到Missing type map configuration or unsupported mapping例外。

在查看AssertConfigurationIsValid()抛出的异常时,我可以看到自动播放器仍在查看DAL和DTO层之间的映射,而不是预期的DTO和MVC应用层。

那么如何在同一个解决方案中的2个独立项目中使用automapper而不会出现这种情况"流血"映射的影响?

非常感谢任何想法。

1 个答案:

答案 0 :(得分:1)

您可以通过在每个项目中存储AutoMapper配置,然后使用配置创建Mapper来保持映射分离:

// DTO project
MapperConfiguration dtoConfig;

dtoConfig = new MapperConfiguration(cfg => {
    cfg.CreateMap<Foo, Bar>();
    cfg.AddProfile<DtoProfile>();
});

// MVC project
MapperConfiguration mvcConfig;

mvcConfig = new MapperConfiguration(cfg => {
    cfg.CreateMap<Foo, Bar>();
    cfg.AddProfile<MvcProfile>();
});

然后,当您想要映射类时,使用适当的配置来创建映射器:

var mapper = mvcConfig.CreateMapper();
mapper.Map<Foo, Bar>(foo);