ASP.NET Core MVC中的AutoMapper实现

时间:2016-10-18 17:57:47

标签: asp.net-core automapper

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

这是my startup.cs

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

    services.AddAutoMapper();

…

    // Autofac configuration
    return ConfigureAutofacContainer(services);
}

这是my AutoMapper.Profile implementation

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

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

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

我遇到以下异常:

  

类型&#39; System.InvalidOperationException&#39;的例外情况发生在   AutoMapper.dll但未在用户代码中处理

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

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

  

System.InvalidOperationException未被用户代码
处理   HResult = -2146233079 Message = Mapper未初始化。调用Initialize   配置适当。如果您正在尝试使用mapper   通过容器或其他方式的实例,确保您没有   任何对静态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:行   22          在Dna.NetCore.Core.BLL.Mappers.AutoMapperProfile_NetCore_DtoFromDao..ctor()   在   C:\ SRC \ AutoMapper.Extensions.Microsoft.DependencyInjection的\ src \ Dna.NetCore.Core.BLL \映射器\ AutoMapperProfile_NetCore_DtoFromDao.cs:行   13 InnerException:

1 个答案:

答案 0 :(得分:8)

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

services.AddAutoMapper(typeof(Startup));

从Profiles的Startup类扫描程序集,并使用Mapper.Initialize自动添加它们。在此之后不要调用Mapper.Initialize。

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

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