2012-10-30 45 views
2

我們目前使用擴展方法來提供這種功能,但我不禁感到有一個更清潔的解決方案。我玩過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是隻包含模型的屬性的類。沒什麼特別的。

我考慮過裝配配置域對象,以便它可以用來代替模型,但決定不使用它。如果我想以兩種不同的方式表示供應數據 - 如果我使用域對象本身作爲我的模型,這將是不可能的。

我應該考慮哪些其他選項?擴展方法將是我的最後選擇 - 尤其是當我必須在ToProvisioning中執行相對繁重的工作時。

回答

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

Intialize的與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); 
相關問題