MVC Core 2.0 services.AddAutoMapper() 行为中的自动映射器
Automapper in MVC Core 2.0 services.AddAutoMapper() behavior
我有这样的解决方案:
MVC Core 2.0 application <-> Business Class library <-> Domain class library
(ViewModel) <- P1 -> (Dto) <-P2-> (Domain entity)
我在每个 MVC 和业务项目中创建了 Automapper 配置文件,用于映射 ViewModel<->Dto (P1) 和 Dto<->Domain 实体 (P2)。 P1 profile&map在MVC项目中,P2 profile&map在Business库中。
然后我创建了一个 xUnit 测试项目,它创建了一个 Dto 对象并将其发送到业务服务,在我调用的 init 单元测试中:
Business.App.AutoMapperConfiguration.Configure();
并且此单元测试完全符合预期。
然后我在 MVC 控制器中执行相同的操作(我什至 copy/pasted 来自单元测试的代码)并且我在将 Dto 映射到域实体 时收到错误 :
Unmapped members were found. Review the types and members below...
我在 startup.cs 中配置了 Automapper 地图,如下所示:
services.AddAutoMapper();
如果我理解正确,这应该遍历所有程序集 类 继承配置文件并将它们添加到配置中。
示例地图:
public class StrankaMap : Profile
{
public override string ProfileName => nameof(StrankaMap);
public StrankaMap()
{
CreateMap<SomeDto, SomeDomainEntity>().ReverseMap()
CreateMap<AnotherDto, AnotherDomainEntity>().ReverseMap()
}
}
如果我的单元测试有效但 MVC 应用程序无效,我不知道此错误的原因是什么 - 我什至将代码从单元测试复制到 MVC 控制器并 运行。我怀疑配置有误。我是否正确假设在 Startup.cs 中添加 services.AddAutoMapper();这足以工作吗?
解决方案(编辑)
显然我误解了 service.AddAutoMapper() 将遍历所有程序集并搜索 Profile inherited 类。可能有更好的解决方案,但我在@LucianBargaoanu 评论的提示的帮助下使用了下面的解决方案。
我是这样解决的:
// Startup.cs
services.AddAutoMapper(
typeof(Business.App.AutoMapperConfiguration),
typeof(MvcApp.Infrastructure.Configuration.AutoMapperConfiguration));
//And the AutoMapperConfiguration class:
namespace MvcApp.Infrastructure.Configuration
{
using AutoMapper;
public class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<Models.Mapping.StrankaMap>();
});
}
}
}
显然我误解了 service.AddAutoMapper() 将遍历所有程序集并搜索 Profile inherited 类。可能有更好的解决方案,但我在@LucianBargaoanu 评论的提示的帮助下使用了下面的解决方案。
我是这样解决的:
// Startup.cs
services.AddAutoMapper(
typeof(Business.App.AutoMapperConfiguration),
typeof(MvcApp.Infrastructure.Configuration.AutoMapperConfiguration));
//And the AutoMapperConfiguration class:
namespace MvcApp.Infrastructure.Configuration
{
using AutoMapper;
public class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<Models.Mapping.StrankaMap>();
});
}
}
}
我有这样的解决方案:
MVC Core 2.0 application <-> Business Class library <-> Domain class library
(ViewModel) <- P1 -> (Dto) <-P2-> (Domain entity)
我在每个 MVC 和业务项目中创建了 Automapper 配置文件,用于映射 ViewModel<->Dto (P1) 和 Dto<->Domain 实体 (P2)。 P1 profile&map在MVC项目中,P2 profile&map在Business库中。
然后我创建了一个 xUnit 测试项目,它创建了一个 Dto 对象并将其发送到业务服务,在我调用的 init 单元测试中:
Business.App.AutoMapperConfiguration.Configure();
并且此单元测试完全符合预期。
然后我在 MVC 控制器中执行相同的操作(我什至 copy/pasted 来自单元测试的代码)并且我在将 Dto 映射到域实体 时收到错误 :
Unmapped members were found. Review the types and members below...
我在 startup.cs 中配置了 Automapper 地图,如下所示:
services.AddAutoMapper();
如果我理解正确,这应该遍历所有程序集 类 继承配置文件并将它们添加到配置中。
示例地图:
public class StrankaMap : Profile
{
public override string ProfileName => nameof(StrankaMap);
public StrankaMap()
{
CreateMap<SomeDto, SomeDomainEntity>().ReverseMap()
CreateMap<AnotherDto, AnotherDomainEntity>().ReverseMap()
}
}
如果我的单元测试有效但 MVC 应用程序无效,我不知道此错误的原因是什么 - 我什至将代码从单元测试复制到 MVC 控制器并 运行。我怀疑配置有误。我是否正确假设在 Startup.cs 中添加 services.AddAutoMapper();这足以工作吗?
解决方案(编辑)
显然我误解了 service.AddAutoMapper() 将遍历所有程序集并搜索 Profile inherited 类。可能有更好的解决方案,但我在@LucianBargaoanu 评论的提示的帮助下使用了下面的解决方案。
我是这样解决的:
// Startup.cs
services.AddAutoMapper(
typeof(Business.App.AutoMapperConfiguration),
typeof(MvcApp.Infrastructure.Configuration.AutoMapperConfiguration));
//And the AutoMapperConfiguration class:
namespace MvcApp.Infrastructure.Configuration
{
using AutoMapper;
public class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<Models.Mapping.StrankaMap>();
});
}
}
}
显然我误解了 service.AddAutoMapper() 将遍历所有程序集并搜索 Profile inherited 类。可能有更好的解决方案,但我在@LucianBargaoanu 评论的提示的帮助下使用了下面的解决方案。
我是这样解决的:
// Startup.cs
services.AddAutoMapper(
typeof(Business.App.AutoMapperConfiguration),
typeof(MvcApp.Infrastructure.Configuration.AutoMapperConfiguration));
//And the AutoMapperConfiguration class:
namespace MvcApp.Infrastructure.Configuration
{
using AutoMapper;
public class AutoMapperConfiguration
{
public static void Configure()
{
Mapper.Initialize(x =>
{
x.AddProfile<Models.Mapping.StrankaMap>();
});
}
}
}