Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows runtime DTO到特定对象的转换模式_Windows Runtime_Type Conversion_Dto - Fatal编程技术网

Windows runtime DTO到特定对象的转换模式

Windows 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方向的映射

架构:Win8应用程序+本地Web API自主机共享一个公共“合同”项目

Web API返回非常通用的合同类型(IEnumerable等)

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


我很想使用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());
}
}
}