DTO到特定的对象转换模式

时间:2013-01-22 12:52:45

标签: windows-runtime type-conversion dto

架构:Win8 app +本地Web API Self-Host共享一个共同的“合同”项目。

Web API返回非常一般的合同类型(IEnumerable等)。

在Win8应用程序中,我想将这些合同转换为具体的MVVM兼容模型对象,例如使用ObservableCollection而不是IEnumerables。

我很乐意使用AutoMapper完成此任务,但它与WinRT不兼容。

3 个答案:

答案 0 :(得分:0)

我前段时间使用过AutoMapper,但现在我通常使用一个特定的类来完成这项工作,所以我可以测试它并实现“奇怪的”逻辑。该类负责2方向的映射(如果两者都需要)。 有时,因为我很懒;-),我使用隐式转换运算符来简化转换,但我认为概念上dto的构造函数可能更好:

公共类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;
}

在所有这些情况下,我认为测试映射的可能性很有价值。

答案 1 :(得分:0)

您可以自己使用反射(System.Reflection)来映射您的DTO,使用便携式CLR类型在属性和映射的循环中。

答案 2 :(得分: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()));
        }
    }
}