我们目前使用扩展方法来提供此功能,但我不禁感到有一个更清洁的解决方案。我玩过AutoMapper,但我无法在复杂的情况下看到它是如何解决这个问题的。对于一个简单的1:1它可以工作,但如果需要任何数据摆弄 - 它似乎是一个失望。
所以,我有类似的东西:
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域对象,以便它可以用来代替模型,但决定反对它。如果我想用两种不同的方式表示配置数据怎么办?如果我使用域对象本身作为我的模型,这将是不可能的。
我应该考虑哪些其他选择?扩展方法将是我的最后选择 - 特别是当我必须在ToProvisioning中做相对繁重的工作时。
答案 0 :(得分:2)
在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;
}
}
使用AutoMapper初始化客户类型转换器
/// <summary>
/// Configures the aut do mapper.
/// </summary>
public static void ConfigureAutoMapper()
{
AutoMapper.Mapper.Initialize(c=> c.CreateMap<CreateMomentoCommand, Momento>().ConvertUsing(new CreateMomentoCommandToMomentoConverter()));
}
最后映射它。
Mapper.Map<CreateMomentoCommand, Momento>(command);