2013-01-22 2 views
0

아키텍처 : Win8 앱 + 로컬 웹 API 자체 호스트는 일반적인 "계약"프로젝트를 공유합니다.특정 개체 변환 패턴에 대한 DTO

웹 API는 매우 일반적인 계약 유형 (IEnumerable 등)을 반환합니다.

Win8 앱에서 IEnumerables 대신 ObservableCollection을 사용하는 구체적인 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 이드 (get; 세트; } 공용 문자열 설명 {get; 세트; }

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

이 모든 경우에 매핑을 테스트 할 가능성이 큰 것으로 생각됩니다.

0

리퍼 (System.Reflection)를 매퍼의 DTO에 사용할 수 있습니다. 반복적으로 속성과 루프를 사용하여 이식 가능한 CLR 유형을 사용합니다.