架构:Win8 应用 + 本地 Web API Self-Host 共享一个通用的“Contracts”项目。
Web API 返回非常通用的合约类型(IEnumerable 等)。
在 Win8 应用程序中,我想将这些合同转换为具体的 MVVM 兼容模型对象,例如使用 ObservableCollection 而不是 IEnumerables。
我很想使用 AutoMapper 来完成这项任务,但它与 WinRT 不兼容。
架构:Win8 应用 + 本地 Web API Self-Host 共享一个通用的“Contracts”项目。
Web API 返回非常通用的合约类型(IEnumerable 等)。
在 Win8 应用程序中,我想将这些合同转换为具体的 MVVM 兼容模型对象,例如使用 ObservableCollection 而不是 IEnumerables。
我很想使用 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 { public Int32 Id { get; 放; } 公共字符串描述 { 获取;放; }
public static implicit operator ItemDto (Item item)
{
var dto = new ItemDto()
{
Id = item.Id,
Description = item.LongDescription
};
return dto;
}
在所有这些情况下,我认为测试映射的可能性具有很大的价值。
您可以自己使用反射 (System.Reflection) 映射您的 DTO,在循环中使用可移植 CLR 类型的属性和映射。