C# 如何传输域对象';其模型对应物的属性?
我们目前使用扩展方法来提供此功能,但我忍不住觉得有一个更干净的解决方案。我和AutoMapper打过交道,但我不太明白它是如何解决复杂情况下的问题的。对于一个简单的1:1来说,它是可行的,但如果需要对数据进行任何修改,这似乎是一种失望 所以,我有这样的想法:C# 如何传输域对象';其模型对应物的属性?,c#,asp.net-mvc,model,C#,Asp.net Mvc,Model,我们目前使用扩展方法来提供此功能,但我忍不住觉得有一个更干净的解决方案。我和AutoMapper打过交道,但我不太明白它是如何解决复杂情况下的问题的。对于一个简单的1:1来说,它是可行的,但如果需要对数据进行任何修改,这似乎是一种失望 所以,我有这样的想法: public static class ProvisioningExtensions { // Convert ProvisioningServicesProxy.Provisioning to ProvisioningDetail
public static class ProvisioningExtensions
{
// Convert ProvisioningServicesProxy.Provisioning to ProvisioningDetailsModel.
public static ProvisioningDetailsModel ToProvisioningDetailsModel(this Provisioning provisioning)
{
var provisioningDetailsModel = new ProvisioningDetailsModel
{
ID = provisioning.ID,
TaskDeviceID = provisioning.TaskDevice.ID,
ServiceGroupID = provisioning.ServiceGroup.ID,
ServiceID = provisioning.Service.ID,
PatchSchedules = provisioning.PatchSchedules.Select(ps => ps.ToPatchScheduleDetailsModel()).ToList()
};
return provisioningDetailsModel;
}
// Convert ProvisioningDetailsModel to ProvisioningServicesProxy.PatchSchedule.
public static Provisioning ToProvisioning(this ProvisioningDetailsModel provisioningDetailsModel)
{
WorkflowManager workflowManager = new WorkflowManager();
ProvisioningManager provisioningManager = new ProvisioningManager();
TaskDevice taskDevice = workflowManager.GetTaskDeviceByID(provisioningDetailsModel.TaskDeviceID);
Service service = provisioningManager.GetServiceByID(provisioningDetailsModel.ServiceID);
ServiceGroup serviceGroup = provisioningManager.GetServiceGroupByID(provisioningDetailsModel.ServiceGroupID);
var provisioning = new Provisioning
{
ID = provisioningDetailsModel.ID,
TaskDevice = taskDevice,
ServiceGroup = serviceGroup,
Service = service,
PatchSchedules = provisioningDetailsModel.PatchSchedules.Select(ps => ps.ToPatchSchedule()).ToArray()
};
return provisioning;
}
}
ProvisioningDetailsModel是一个仅包含模型属性的类。没什么特别的
我曾考虑过装饰Provisioning域对象,使其可以用来代替模型,但最终决定不这么做。如果我想用两种不同的方式来表示供应数据会怎么样?如果我使用域对象本身作为模型,这是不可能的
我还应该考虑哪些其他选择?扩展方法将是我最后的选择——尤其是当我必须在toprovision中完成相对繁重的工作时。在AutoMapper中,您可以创建类型自定义转换器。这是通过实现ITypeConverter接口来实现的
public class CreateMomentoCommandToMomentoConverter : ITypeConverter<CreateMomentoCommand, Momento>
{
public Momento Convert(ResolutionContext context)
{
var source = (CreateMomentoCommand) context.SourceValue;
var momento = new Momento {Username = source.Username};
return momento;
}
}
public类createMomentCommandTomomentoConverter:ITypeConverter
{
公共时间转换(ResolutionContext上下文)
{
var source=(createMomentCommand)context.SourceValue;
var momento=new momento{Username=source.Username};
返回时刻;
}
}
使用AutoMapper初始化客户类型转换器
/// <summary>
/// Configures the aut do mapper.
/// </summary>
public static void ConfigureAutoMapper()
{
AutoMapper.Mapper.Initialize(c=> c.CreateMap<CreateMomentoCommand, Momento>().ConvertUsing(new CreateMomentoCommandToMomentoConverter()));
}
//
///配置aut do映射器。
///
公共静态无效配置自动映射()
{
初始化(c=>c.CreateMap().ConvertUsing(新的createMomentCommandTomomentoConverter());
}
最后,绘制地图
Mapper.Map<CreateMomentoCommand, Momento>(command);
Mapper.Map(命令);