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