我们目前使用扩展方法来提供此功能,但我不禁觉得有一个更清洁的解决方案。我玩过 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 中做相对繁重的工作时。