asp.net MVC 3 - 自动映射器中的随机"Missing type map configuration or unsupported mapping."错误



有关解决方案,请参阅本文。

好吧,我终于想通了。以下内容:AppDomain。CurrentDomain。GetAssembly()我的一段代码有时无法获得映射程序集,所以当它丢失时,我会得到一个错误。通过强制应用程序查找所有程序集来替换此代码解决了我的问题。

我的实体:

    /// <summary>
    /// Get/Set the name of the Country
    /// </summary>
    public string CountryName { get; set; }
    /// <summary>
    /// Get/Set the international code of the Country
    /// </summary>
    public string CountryCode { get; set; }
    /// <summary>
    /// Get/Set the coordinate of the Country
    /// </summary>
    public Coordinate CountryCoordinate { get; set; }
    /// <summary>
    /// Get/Set the cities of the country
    /// </summary>
    public virtual ICollection<City> Cities
    {
        get
        {
            if (_cities == null)
            {
                _cities = new HashSet<City>();
            }
            return _cities;
        }
        private set
        {
            _cities = new HashSet<City>(value);
        }
    }

我的DTO:

    public Guid Id { get; set; }
    public string CountryName { get; set; }
    public string CountryCode { get; set; }
    public string Lattitude { get; set; }
    public string Longtitude { get; set; }
    public List<CityDTO> Cities { get; set; }

我的配置

        // Country => CountryDTO
        var countryMappingExpression = Mapper.CreateMap<Country, CountryDTO>();
        countryMappingExpression.ForMember(dto => dto.Lattitude, mc => mc.MapFrom(e => e.CountryCoordinate.Lattitude));
        countryMappingExpression.ForMember(dto => dto.Longtitude, mc => mc.MapFrom(e => e.CountryCoordinate.Longtitude));

在Global.asax Application_Start中,我有:

        Bootstrapper.Initialise();

在引导程序中我有:

public static class Bootstrapper
{
    private static IUnityContainer _container;
    public static IUnityContainer Current
    {
        get
        {
            return _container;
        }
    }
    public static void Initialise()
    {
        var container = BuildUnityContainer();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
    private static IUnityContainer BuildUnityContainer()
    {
        _container = new UnityContainer();
        _container.RegisterType(typeof(BoundedContextUnitOfWork), new PerResolveLifetimeManager());
        _container.RegisterType<ICountryRepository, CountryRepository>();  
        _container.RegisterType<ITypeAdapterFactory, AutomapperTypeAdapterFactory>(new ContainerControlledLifetimeManager());
        _container.RegisterType<ICountryAppService, CountryAppServices>(); 
        EntityValidatorFactory.SetCurrent(new DataAnnotationsEntityValidatorFactory());
        var typeAdapterFactory = _container.Resolve<ITypeAdapterFactory>();
        TypeAdapterFactory.SetAdapter(typeAdapterFactory);
        return _container;
    }
}

我的适配器在哪里:

public class AutomapperTypeAdapter : ITypeAdapter
{
    public TTarget Adapt<TSource, TTarget>(TSource source)
        where TSource : class
        where TTarget : class, new()
    {
        return Mapper.Map<TSource, TTarget>(source);
    }
    public TTarget Adapt<TTarget>(object source) where TTarget : class, new()
    {
        return Mapper.Map<TTarget>(source);
    }
}

AdapterFactory是:

    public AutomapperTypeAdapterFactory()
    {
        //Scan all assemblies to find an Auto Mapper Profile
        var profiles = AppDomain.CurrentDomain
                                .GetAssemblies()
                                .SelectMany(a => a.GetTypes())
                                .Where(t => t.BaseType == typeof(Profile));
        Mapper.Initialize(cfg =>
        {
            foreach (var item in profiles)
            {
                if (item.FullName != "AutoMapper.SelfProfiler`2")
                    cfg.AddProfile(Activator.CreateInstance(item) as Profile);
            }
        });
    }

因此,我随机得到一个"缺少类型映射配置或不支持的映射"错误指示:

    public TTarget Adapt<TTarget>(object source) where TTarget : class, new()
    {
        return Mapper.Map<TTarget>(source);
    }

虽然此错误随机发生,但很难调试并查看会发生什么。我找了很多找不到合适的解决方案。

错误如下:

缺少类型映射配置或不支持的映射。

映射类型:国家/地区->CountryDTOMyApp。领域BoundedContext。国家->MyApp。应用BoundedContext。CountryDTO

目标路径:列表`1[0]

源值:MyApp。领域BoundedContext。国家

我的项目是一个MVC 3项目,带有Automapper 2.2和Unity IoC。。

我将感谢任何想法、建议或解决方案,并感谢您的回答。

如果你使用Mapper.AssertConfigurationIsValid();,你会得到更详细的信息:

找到了未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析程序或修改源/目的地类型

在任何情况下,您都必须映射目标模型的所有属性。你错过了CityDTO和Id。这里:

Mapper.CreateMap<City, CityDTO>();
Mapper.CreateMap<Country, CountryDTO>()
    .ForMember(dto => dto.Id, options => options.Ignore())
    .ForMember(dto => dto.Longtitude, mc => mc.MapFrom(e => e.CountryCoordinate.Longtitude))
    .ForMember(dto => dto.Lattitude, mc => mc.MapFrom(e => e.CountryCoordinate.Lattitude));

也许您需要在CityDTO上添加一些地图,因为您没有指定它们。

对我来说,这个错误与我将CreateMap<>()调用放在哪里有关。我已经把它放在了DTO的静态初始值设定项中。当我把CreateMap<>()呼叫转移到不那么可爱的地方时,一切都很好。

相关内容

  • 没有找到相关文章

最新更新