Windows runtime DTO到特定对象的转换模式
架构:Win8应用程序+本地Web API自主机共享一个公共“合同”项目 Web API返回非常通用的合同类型(IEnumerable等) 在Win8应用程序中,我希望将这些契约转换为具体的MVVM兼容模型对象,例如使用ObservableCollection而不是IEnumerablesWindows runtime DTO到特定对象的转换模式,windows-runtime,type-conversion,dto,Windows Runtime,Type Conversion,Dto,架构:Win8应用程序+本地Web API自主机共享一个公共“合同”项目 Web API返回非常通用的合同类型(IEnumerable等) 在Win8应用程序中,我希望将这些契约转换为具体的MVVM兼容模型对象,例如使用ObservableCollection而不是IEnumerables 我很想使用AutoMapper来完成这项任务,但它与WinRT不兼容。我不久前使用过AutoMapper,但现在我通常使用一个特定的类来完成这项工作,因此我可以测试它并实现“奇怪”的逻辑。此类负责2方向的映射
我很想使用AutoMapper来完成这项任务,但它与WinRT不兼容。我不久前使用过AutoMapper,但现在我通常使用一个特定的类来完成这项工作,因此我可以测试它并实现“奇怪”的逻辑。此类负责2方向的映射(如果两者都需要)。 有时候,因为我懒惰;-),我使用了隐式转换运算符来简化转换,但我认为从概念上讲,dto的构造函数可能更好: 公共类ItemDto { 公共Int32 Id{get;set;} 公共字符串说明{get;set;}
public static implicit operator ItemDto (Item item)
{
var dto = new ItemDto()
{
Id = item.Id,
Description = item.LongDescription
};
return dto;
}
在所有这些情况下,我认为测试映射的可能性具有很大的价值。您可以自己使用映射器DTO的反射(System.reflection),通过属性循环,并使用便携式CLR类型进行映射。谢谢您的建议 我用一种非通用的方式解决了这个问题,对于每一个模型,我都有一个特定的转换器来完成这项工作。你认为呢
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()));
}
}
}
使用项目合同;
使用项目模型;
名称空间Project.converts.Contracts
{
公共静态类转换器
{
公共静态产品合同到合同(此产品模型)
{
if(model==null)
{
返回新的ProductContract();
}
返回新产品合同
{
Id=model.Id,
Name=mode.Name,
Tags=model.Tags.ToContracts()
};
}
公共静态IContracts集合(此IEnumerable models)
{
if(models==null)
{
返回新集合();
}
返回模型。选择(m=>m.ToContract()).ToList();
}
公共静态产品ToModel(本产品合同)
{
如果(合同==null)
{
退回新产品();
}
退回新产品
{
Id=contract.Id,
Name=contract.Name,
Tags=contract.Tags.ToModels()
};
}
公共静态可观测收集模型(此IEnumerable contracts)
{
如果(合同==null)
{
返回新的ObservableCollection();
}
返回新的observeCollection(contracts.Select(c=>c.ToModel());
}
}
}