C# 如何映射具有4个不同特性类的2个对象?
我有6个类,我想用AutoMapper映射它们C# 如何映射具有4个不同特性类的2个对象?,c#,automapper,C#,Automapper,我有6个类,我想用AutoMapper映射它们 public class Alert { public string MessageSender { get; set; } public Site Site { get; set; } public IEnumerable<Recipient> Recipients { get; set; } } pub
public class Alert
{
public string MessageSender { get; set; }
public Site Site { get; set; }
public IEnumerable<Recipient> Recipients { get; set; }
}
public class AlertModel
{
public string Sender { get; set; }
public SiteModel Site { get; set; }
public IEnumerable<RecipientModel> Recipients { get; set; }
}
public class Site
{
public int Id { get; set; }
}
public class SiteModel
{
public int Id { get; set; }
}
public class Recipient
{
public int Id { get; set; }
public string CallId { get; set; }
}
public class RecipientModel
{
public int Id { get; set; }
public string CallId { get; set; }
}
private static void ConfigureAlertMapping()
{
AutoMapper.Mapper.Initialize(cfg =>
cfg.CreateMap<Alert, AlertModel>()
.ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.MessageSender))
);
}
private static void ConfigureRecipientMapping()
{
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Recipient, RecipientModel>());
}
private static void ConfigureSiteMapping()
{
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<Site, SiteModel>());
}
公共类警报
{
公共字符串MessageSender{get;set;}
公共站点站点{get;set;}
公共IEnumerable收件人{get;set;}
}
公共类警报模型
{
公共字符串发送方{get;set;}
公共站点模型站点{get;set;}
公共IEnumerable收件人{get;set;}
}
公共类网站
{
公共int Id{get;set;}
}
公共类站点模型
{
公共int Id{get;set;}
}
公共类收件人
{
公共int Id{get;set;}
公共字符串CallId{get;set;}
}
公共类接受者模型
{
公共int Id{get;set;}
公共字符串CallId{get;set;}
}
私有静态void ConfigureAlertMapping()
{
AutoMapper.Mapper.Initialize(cfg=>
cfg.CreateMap()
.ForMember(dest=>dest.Sender,opt=>opt.MapFrom(src=>src.MessageSender))
);
}
私有静态void ConfigureRecipientMapping()
{
初始化(cfg=>cfg.CreateMap());
}
私有静态void ConfigureSiteMapping()
{
初始化(cfg=>cfg.CreateMap());
}
这就是我要映射的对象
Alert alert = new Alert()
{
Site = new Site() { Id = 1 },
Recipients = new List<Recipient> { new Recipient() { CallId = "1001" } }
};
警报警报=新警报()
{
Site=newsite(){Id=1},
收件人=新列表{new Recipient(){CallId=“1001”}
};
我想调用此函数,但引发异常…:(
AlertModel-alertOutputInfo=AutoMapper.Mapper.Map(警报);
这是错误:
>>Mapping types:
Alert -> AlertModel
UniteAlerter.Domain.Models.Alert -> UniteAlerter.Gateway.Models.AlertModel
at lambda_method(Closure , Alert , AlertModel , ResolutionContext )
at AutoMapper.Mapper.AutoMapper.IMapper.Map[TSource,TDestination](TSource source)
at AutoMapper.Mapper.Map[TSource,TDestination](TSource source)
at UniteAlerter.Gateway.AlertGateway.<SendAlert>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
映射类型:
警报->警报模型
UniteAlerter.Domain.Models.Alert->UniteAlerter.Gateway.Models.AlertModel
at lambda_方法(关闭、警报、警报模型、ResolutionContext)
在AutoMapper.Mapper.AutoMapper.IMapper.Map[TSource,TDestination](TSource source)
在AutoMapper.Mapper.Map[TSource,TDestination](TSource-source)
在UniteAlerter.Gateway.AlertGateway.d_u1.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
如果您将找到其他解决方案,请将其添加到此处。更新(解决方案)
我发现了问题…我为我想要映射的每个类初始化映射器,但解决方案是用所有映射一次性初始化映射器
AutoMapper.Mapper.Initialize(
cfg =>
{
cfg.CreateMap<Alert, AlertModel>().ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.MessageSender));
cfg.CreateMap<Recipient, RecipientModel>();
cfg.CreateMap<Site, SiteModel>();
}
);
AutoMapper.Mapper.Initialize(
cfg=>
{
CreateMap().formMember(dest=>dest.Sender,opt=>opt.MapFrom(src=>src.MessageSender));
CreateMap();
CreateMap();
}
);
更新(解决方案)
我发现了问题…我为我想要映射的每个类初始化映射器,但解决方案是用所有映射一次性初始化映射器
AutoMapper.Mapper.Initialize(
cfg =>
{
cfg.CreateMap<Alert, AlertModel>().ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.MessageSender));
cfg.CreateMap<Recipient, RecipientModel>();
cfg.CreateMap<Site, SiteModel>();
}
);
AutoMapper.Mapper.Initialize(
cfg=>
{
CreateMap().formMember(dest=>dest.Sender,opt=>opt.MapFrom(src=>src.MessageSender));
CreateMap();
CreateMap();
}
);
您也可以提供映射配置吗当然,您需要向下滚动第一个代码注释(最后3个方法)。我在一个名为Configure的函数中调用这些方法,该函数在Startup->ConfigureServices(IServiceCollection services)中调用您应该将您的解决方案添加为答案,然后将其设置为可接受的答案。您也可以提供映射配置吗?当然,您需要向下滚动第一个代码注释(最后3个方法)。我在名为Configure的方法中调用这些方法,该方法在Startup->ConfigureServices(IServiceCollection服务)中调用您应该将您的解决方案添加为答案,然后将其设置为接受答案