0

我正在尝试在域对象和视图模型之间创建一个映射,以支持一个感觉很常见的用例。我找不到解决方案的事实使我认为我正在错误地解决问题。这是一些代表我的源和目标类型的伪代码:

public class DomainClass
    {
        public NestedDomainClass1 NestedDomainClass1{ get; set; }
    }

    public class NestedDomainClass1
    {
        public NestedDomainClass2 NestedDomainClass2 { get; set; }
    }

    public class NestedDomainClass2
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
    }


    public class DomainViewModel
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
    }

如您所见,DomainViewModel完美地映射到DomainClass.NestedDomainClass1.NestedDomainClass2. 但是,由于不完全相关的原因,我不能简单地在该级别创建映射。相反,我必须映射更高的两个级别:

 Mapper.CreateMap<DomainObj, DomainViewModel>();

不幸的是,在我这样做的那一刻,我不能再依赖 AutoMapper 约定来自动映射类似命名的属性,并且我不得不编写大量高度重复的代码:

Mapper.CreateMap<DomainClass, DomainViewModel>().ForMember(dest=>dest.PropertyA, opt=>opt.MapFrom(source=>source.NestedDomainClass1.NestedDomainClass2.PropertyA));
Mapper.CreateMap<DomainClass, DomainViewModel>().ForMember(dest=>dest.PropertyB, opt=>opt.MapFrom(source=>source.NestedDomainClass1.NestedDomainClass2.PropertyB));

我玩过RecognizeDestinationPrefixesandRecognizeDestinationPostfixes方法,希望让 AutoMapper 直接“跳过”到我想从 ( NestedDomainClass2) 映射的属性,但没有运气。任何帮助,将不胜感激!

4

1 回答 1

0

那是因为您正在尝试两种完全不同的类型之间的映射。你真的需要做这样的事情:

Mapper.CreateMap<NestedDomainClass2, DomainViewModel>();
Mapper.AssertConfigurationIsValid();

var dvm = Mapper.Map<NestedDomainClass2, DomainViewModel>
                         (obj.NestedDomainClass1.NestedDomainClass2);

但是,如果您愿意,您可以通过定义一个TypeConverter. 像这样的东西应该工作:

public class DomainTypeConverter : TypeConverter<DomainClass, DomainViewModel>
{
    protected override DomainViewModel ConvertCore(DomainClass source)
    {
        return Mapper.Map<NestedDomainClass2, DomainViewModel>
                             (source.NestedDomainClass1.NestedDomainClass2);
    }
}

然后,您可以将映射定义为如下所示:

Mapper.CreateMap<NestedDomainClass2, DomainViewModel>();
Mapper.CreateMap<DomainClass, DomainViewModel>()
    .ConvertUsing(new DomainTypeConverter());
Mapper.AssertConfigurationIsValid();

并像这样使用它:

var dvm = Mapper.Map<DomainClass, DomainViewModel>(dc);
于 2013-04-20T10:13:03.917 回答