C# 自动映射自动映射异常

C# 自动映射自动映射异常,c#,.net,asp.net-mvc,mapping,automapper,C#,.net,Asp.net Mvc,Mapping,Automapper,我发现汽车制造商有一些非常奇怪的行为。 这个简单的代码 internal class Program { private static void Main(string[] args) { Mapper.Initialize(cfg => { cfg.CreateMap<MyClass1, MyClass2>(); }); Mapper.Initialize(cfg => { cfg.CreateMap<MyClass

我发现汽车制造商有一些非常奇怪的行为。 这个简单的代码

internal class Program
{
    private static void Main(string[] args)
    {
        Mapper.Initialize(cfg => { cfg.CreateMap<MyClass1, MyClass2>(); });
        Mapper.Initialize(cfg => { cfg.CreateMap<MyClass3, MyClass4>(); });

        var dto = new MyClass1();
        Mapper.Map<MyClass1, MyClass2>(dto);
    }
}

public class MyClass1
{
}

public class MyClass2
{
}

public class MyClass3
{
}

public class MyClass4
{
}
内部类程序
{
私有静态void Main(字符串[]args)
{
初始化(cfg=>{cfg.CreateMap();});
初始化(cfg=>{cfg.CreateMap();});
var dto=新的MyClass1();
Mapper.Map(dto);
}
}
公共课MyClass1
{
}
公共类MyClass2
{
}
公共类MyClass3
{
}
公共类MyClass4
{
}
生成异常:

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

映射类型:MyClass1->MyClass2控制台应用程序2.MyClass1-> 控制台应用程序2.MyClass2

但是如果改变两行的顺序,像这样初始化行

Mapper.Initialize(cfg => { cfg.CreateMap<MyClass3, MyClass4>(); });
Mapper.Initialize(cfg => { cfg.CreateMap<MyClass1, MyClass2>(); });
Mapper.Initialize(cfg=>{cfg.CreateMap();});
初始化(cfg=>{cfg.CreateMap();});
一切都很好。发生了什么?发生什么事了

长话短说,Jimmy暂时不再使用AutoMapper中的静态内容,转而使用基于实例的映射。然而,正如吉米所说:

静态映射器没有被删除,只是能够在代码中的任何地方调用CreateMap

问题的答案是,你试图初始化两次,而不是一次

要回答关于如何在代码中分散不同配置的下一个问题,请使用
Profile

要回答如何配置所有这些,请参阅以下内容:


对于AutoMapper 5.1.1 有一个
MapperConfigurationExpression

您可以传递到映射器,或者
映射器
执行
操作

IMapperConfigurationExpression
公开了以下内容:

void AddProfile(Profile profile)
因此,您可以执行与下面大致相同的操作,但要针对
IMapper
接口注册所有内容,这似乎是
4.2.1
的发展方向

适用于AutoMapper 4.2.1(简介简介) 以下是一个示例配置文件:

using AutoMapper;

using TreasuryRecords.Database.Models;
using TreasuryRecords.Requests.Account.Models;

public class AccountMappings : Profile
{
    protected override void Configure()
    {
        this.CreateMap<RegisterDto, Client>()
            .ForMember(x => x.UserName, c => c.MapFrom(x => x.Email));
    }
}

不要调用
Initialize
两次。。。。。调用一次…尝试使用Mapper.CreateMap进行映射配置。“不要调用Initialize两次…调用一次…”-是的,它可以工作。但是如果我需要在代码的不同部分初始化,我应该怎么做?我不能使用静态方法,只能使用实例?”尝试使用Mapper.CreateMap这用于映射配置“你的意思是使用实例而不是静态方法还是什么?-是的,它可以工作。但是如果我需要在代码的不同部分初始化,我应该怎么做?我不能使用静态方法,只能使用实例?AutoMapper使用实例配置。您可以使用AutoMapper配置文件。然后您可以使用扩展方法加载所有配置文件…太好了!但是5.1.1 AutoMapper中没有Mapper.Configuration.AddProfile。它被删除了还是使用了一些扩展?再次更新,对于
5.1.1
yes,我可以使用IMapperConfigurationExpression.AddProfile创建新配置,但我无法将其应用于静态映射器。我只能创建新配置和新映射器的实例
using System;
using System.Linq;
using System.Reflection;

using AutoMapper;

using TreasuryRecords.Requests.Authenticate.Login;

public static class AutoMapperConfig
{
    public static void Configure()
    {
        Assembly
            .GetExecutingAssembly()
            .RegisterConfigurations();

        typeof(LoginRequest)
            .Assembly
            .RegisterConfigurations();
    }

    public static void RegisterConfigurations(this Assembly assembly)
    {
        var types = assembly.GetTypes();

        var automapperProfiles = types
                                    .Where(x => typeof(Profile).IsAssignableFrom(x))
                                    .Select(Activator.CreateInstance)
                                    .OfType<Profile>()
                                    .ToList();

        // so here you can pass in the instance of mapper
        // I just use the static for ease
        automapperProfiles.ForEach(Mapper.Configuration.AddProfile);
    }
}
public static void RegisterAutoMapper(this IUnityContainer container)
{
    container.RegisterType<IMapper>(new InjectionFactory(_ => Mapper.Instance));
}
this.mapper.Map<Client>(message.RegistrationDetails);