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>();
            });
        }
    }
}