ASP.NET Core MVC中的AutoMapper实现

Ran*_*dis 5 automapper asp.net-core

我正在尝试使用https://lostechies.com/jimmybogard/2016/07/20/integrating-automapper-with-asp-net-core-di中描述的技术在ASP.NET Core MVC应用程序中实现AutoMapper .

这是我的startup.cs

public IServiceProvider ConfigureServices(IServiceCollection services)
{
 …
    services.AddMvc();

    services.AddAutoMapper();

…

    // Autofac configuration
    return ConfigureAutofacContainer(services);
}
Run Code Online (Sandbox Code Playgroud)

这是我的AutoMapper.Profile实现

public class AutoMapperProfile_NetCore_DtoFromDao : Profile
{
    #region ctor

    public AutoMapperProfile_NetCore_DtoFromDao()
    {
        CreateMaps();
    }

    #endregion

    #region Methods

    protected void CreateMaps()
    {
        if (Mapper.Configuration.FindTypeMapFor(typeof(AddressType),
                                                typeof(AddressTypeDto)) == null)
            CreateMap<AddressType, AddressTypeDto>();

        Mapper.Configuration.AssertConfigurationIsValid();
    }
}
Run Code Online (Sandbox Code Playgroud)

AutoMapperProfile_NetCore_DtoFromDao.CreateMaps()由ServiceCollectionExtensions.AddAutoMapperClasses()调用:

public static class ServiceCollectionExtensions
{
    …
    private static void AddAutoMapperClasses(IServiceCollection services,
               Action<IMapperConfigurationExpression> additionalInitAction, 
               IEnumerable<Assembly> assembliesToScan)
    {
        …
        Mapper.Initialize(cfg =>
        {
            additionalInitAction(cfg);

           foreach (var profile in profiles)
            {
                cfg.AddProfile(profile);
            }
        });
        …
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

AutoMapper.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理

问:这是由于在Mapper.Initialization()期间调用Mapper.Configuration.FindTypeMapFor()的配置文件吗?

问:在初始化期间添加一个映射配置之前,是否可以测试现有的映射配置?

用户代码未处理System.InvalidOperationException
HResult = -2146233079 Message = Mapper未初始化.使用适当的配置调用Initialize.如果您正试图通过容器或以其它方式使用映射器实例,请确保您不必静态Mapper.Map方法的任何电话,如果你使用ProjectTo或UseAsDataSource扩展方法,确保你在适当的IConfigurationProvider通实例.源= AutoMapper
堆栈跟踪:在AutoMapper.Mapper.get_Configuration()在Dna.NetCore.Core.BLL.Mappers.AutoMapperProfile_NetCore_DtoFromDao.CreateMaps()在C:\的Src\AutoMapper.Extensions.Microsoft.DependencyInjection\SRC\Dna.NetCore.Core .BLL \映射器\ AutoMapperProfile_NetCore_DtoFromDao.cs:在Dna.NetCore.Core.BLL.Mappers.AutoMapperProfile_NetCore_DtoFromDao..ctor()在C线22:\ SRC\AutoMapper.Extensions.Microsoft.DependencyInjection\SRC\Dna.NetCore.Core. BLL\Mappers\AutoMapperProfile_NetCore_DtoFromDao.cs:第13行InnerException:

Jim*_*ard 8

好.这里有一些事情.你的AutoMapper配置,最简单的构建方式就是:

services.AddAutoMapper(typeof(Startup));
Run Code Online (Sandbox Code Playgroud)

它从Starts类中扫描程序集以查找Profiles,并使用Mapper.Initialize自动添加它们.在此之后不要调用Mapper.Initialize.

接下来,您的个人资料 你做了很多你不应该做的事情.首先,您的配置文件调用AssertConfigurationIsValid - 不要.接下来,它正在检查现有的TypeMaps - 不要.只需调用基础CreateMap方法即可.

最后,你有一个额外的AddAutoMapperClasses调用.不要使用它.摆脱它.你只需要"services.AddAutoMapper".AddAutoMapper方法调用Mapper.Initialize,并在您传入的程序集中找到Profile类.