Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多项目解决方案中有多个AutoMapper配置_C#_.net_Automapper - Fatal编程技术网

C# 多项目解决方案中有多个AutoMapper配置

C# 多项目解决方案中有多个AutoMapper配置,c#,.net,automapper,C#,.net,Automapper,所以问题很简单,但我就是找不到解决办法 在我的解决方案中,我有一个DAL层(类库)、一个DTO层(类库)和一个MVC项目 其思想是MVC应用程序从DTO层请求项目,而DTO层又从DAL层获取项目。很简单 在DTO层中,我有一个带有上下文的存储库来管理它们。因此,MVC应用程序创建DTO上下文的实例,然后从相应的存储库中获取DTO实体 现在来看问题 在DTO层中,我使用AutoMapper将底层实体映射到DTO,在MVC应用程序中,我计划再次使用它将DTO映射到ViewModels并返回 因此,在

所以问题很简单,但我就是找不到解决办法

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

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

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

现在来看问题

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

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

然而,在MVC应用程序的
Global.asax
中,我也调用了
RegisterMappings()
(从不同的类到DTO层中的类),但是当我尝试在MVC应用程序中从ViewModel映射到DTO时,我得到了
缺少类型映射配置或不支持的映射
异常

查看由
assertconfigurationsvalid()引发的异常时,我可以看到automapper仍在查看DAL和DTO层之间的映射,而不是预期的DTO和MVC应用层

那么,如何在同一解决方案中的两个独立项目中使用automapper,而不产生映射的“出血”效应呢


非常感谢您的任何想法。

您可以通过在每个项目中存储AutoMapper配置,然后使用该配置创建映射器来保持映射的独立性:

// 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>();
});
//DTO项目
MapperConfiguration dtoConfig;
dtoConfig=新的MapperConfiguration(cfg=>{
CreateMap();
AddProfile();
});
//MVC项目
MapperConfiguration mvcConfig;
mvcConfig=新的MapperConfiguration(cfg=>{
CreateMap();
AddProfile();
});
然后,如果要映射类,请使用适当的配置创建映射器:

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

您使用的是AutoMapper 5还是更高版本?然后,我认为您可以单独存储每个配置,而不是使用静态
Mapper
调用,而是使用
config.CreateMapper()为每一层创建一个映射器。@stuartd将其更改为应答lad。对我来说非常有效。