アーキテクチャ:Win8アプリとローカルWeb APIセルフホストは、共通の「契約」プロジェクトを共有します。
Web APIは、非常に一般的なコントラクトタイプ(IEnumerableなど)を返します。
Win8アプリ内で、これらのコントラクトを、たとえばIEnumerablesの代わりにObservableCollectionを使用する具体的なMVVM互換モデルオブジェクトに変換したいと思います。
このタスクにAutoMapperを使用したかったのですが、WinRTとは互換性がありません。
アーキテクチャ:Win8アプリとローカルWeb APIセルフホストは、共通の「契約」プロジェクトを共有します。
Web APIは、非常に一般的なコントラクトタイプ(IEnumerableなど)を返します。
Win8アプリ内で、これらのコントラクトを、たとえばIEnumerablesの代わりにObservableCollectionを使用する具体的なMVVM互換モデルオブジェクトに変換したいと思います。
このタスクにAutoMapperを使用したかったのですが、WinRTとは互換性がありません。
以前はAutoMapperを使用していましたが、現在は通常、特定のクラスを使用してこの作業を行っているため、テストして「奇妙な」ロジックを実装できます。このクラスは、2方向へのマッピングを担当します(両方が必要な場合)。時々、私は怠惰なので;-)、変換を単純化するために暗黙の変換演算子を使用しましたが、概念的にはdtoのコンストラクターの方が優れていると思います。
public class ItemDto {public 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;
}
これらすべての場合において、マッピングをテストする可能性は大きな価値があると思います。
ポータブルCLRタイプを使用したプロパティとマッピングによるループで、自分でDTOをマッパーにリフレクション(System.Reflection)を使用できます。
ご提案ありがとうございます。
私はそれを一般的ではない方法で解決しました。すべてのモデルに対して、私はその仕事をする特定のコンバーターを持っています。どう思いますか?
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()));
}
}
}