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ます。ただし、完全には関係ない理由により、そのレベルで単純にマッピングを作成することはできません。代わりに、2 レベル高くマッピングする必要があります。

 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));

AutoMapper が ( ) からマップしたいプロパティに直接「スキップ」することを期待して、メソッドRecognizeDestinationPrefixesとメソッドを試してみましたが、うまくいきませんでした。どんな助けでも大歓迎です!RecognizeDestinationPostfixesNestedDomainClass2

4

1 に答える 1

0

これは、2 つの完全に異なる型の間でマップしようとしているからです。あなたは本当にこのようなことをする必要があります:

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 に答える