體系結構:Win8應用程序+本地Web API自主主機共享一個常見的「合同」項目。DTO到特定對象轉換模式
Web API返回非常一般的合同類型(IEnumerable等)。
在Win8應用程序中,我想將這些契約轉換爲使用ObservableCollection而不是IEnumerables的具體MVVM兼容模型對象。
我會喜歡使用AutoMapper來完成這個任務,但它與WinRT不兼容。
體系結構:Win8應用程序+本地Web API自主主機共享一個常見的「合同」項目。DTO到特定對象轉換模式
Web API返回非常一般的合同類型(IEnumerable等)。
在Win8應用程序中,我想將這些契約轉換爲使用ObservableCollection而不是IEnumerables的具體MVVM兼容模型對象。
我會喜歡使用AutoMapper來完成這個任務,但它與WinRT不兼容。
謝謝您的建議。
我用非通用的方式解決了這個問題,對於每個模型我都有一個特定的轉換器來完成這項工作。你怎麼看?
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()));
}
}
}
前段時間我使用了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;
}
在所有這些情況下,我認爲測試映射的可能性具有很大的價值。
你可以使用reflection(System.Reflection)來映射你自己的DTO,在循環中通過屬性和映射使用可移植的CLR類型。