2013-01-22 144 views
0

體系結構:Win8應用程序+本地Web API自主主機共享一個常見的「合同」項目。DTO到特定對象轉換模式

Web API返回非常一般的合同類型(IEnumerable等)。

在Win8應用程序中,我想將這些契約轉換爲使用ObservableCollection而不是IEnumerables的具體MVVM兼容模型對象。

我會喜歡使用AutoMapper來完成這個任務,但它與WinRT不兼容。

回答

0

謝謝您的建議。

我用非通用的方式解決了這個問題,對於每個模型我都有一個特定的轉換器來完成這項工作。你怎麼看?

using Project.Contracts; 
using Project.Models; 

namespace Project.Converters.Contracts 
{ 
    public static class ProductConverter 
    { 
     public static ProductContract ToContract(this Product model) 
     { 
      if (model == null) 
      { 
       return new ProductContract(); 
      } 

      return new ProductContract 
      { 
       Id = model.Id, 
       Name = mode.Name, 
       Tags = model.Tags.ToContracts() 
      }; 
     } 

     public static ICollection<ProductContract> ToContracts(this IEnumerable<Product> models) 
     { 
      if (models == null) 
      { 
       return new Collection<ProductContract>(); 
      } 

      return models.Select(m => m.ToContract()).ToList(); 
     } 

     public static Product ToModel(this ProductContract contract) 
     { 
      if (contract == null) 
      { 
       return new Product(); 
      } 

      return new Product 
      { 
       Id = contract.Id, 
       Name = contract.Name, 
       Tags = contract.Tags.ToModels() 
      }; 
     } 

     public static ObservableCollection<Product> ToModels(this IEnumerable<ProductContract> contracts) 
     { 
      if (contracts == null) 
      { 
       return new ObservableCollection<Product>(); 
      } 

      return new ObservableCollection<Product>(contracts.Select(c => c.ToModel())); 
     } 
    } 
} 
0

前段時間我使用了AutoMapper,但現在我通常使用特定的類來完成這項工作,所以我可以測試它並實現「奇怪」的邏輯。這個類負責2方向的映射(如果兩者都需要的話)。 有時候,因爲我很懶;-),我已經使用了隱式轉換操作,簡化了轉換,但我認爲概念的DTO構造可以更好地:

公共類ItemDto { 公衆的Int32 Id {get;組; } public String Description {get;組; }

public static implicit operator ItemDto (Item item) 
{ 
    var dto = new ItemDto() 
        { 
         Id = item.Id, 
         Description = item.LongDescription 
        }; 
    return dto; 
} 

在所有這些情況下,我認爲測試映射的可能性具有很大的價值。

0

你可以使用reflection(System.Reflection)來映射你自己的DTO,在循環中通過屬性和映射使用可移植的CLR類型。