19

で継承を使用する方法を調べてきましたが、AutoMapper完全に機能させるのに苦労していLinqます。これが私のコードです:

ここでマッピングを定義しました:

CreateMap<Article, ArticleDetailsViewModel>()
    .Include<Article, ArticleNewsItemDetailsViewModel();

CreateMap<Article, ArticleNewsItemDetailsViewModel>();

ArticleDetailsViewModelの基本クラスですArticleNewsItemDetailsViewModel

私が持っていた場合、ここに問題があります:

CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();

ビュー モデルのすべてのプロパティは、対応する Linq オブジェクトと同じ名前であるため、自動的にマップされます。ただしArticle => ArticleNewsItemDetailsViewModelマッピングを使用しているため、これは不可能です。代わりに、それぞれを次のように定義する必要があります。

.ForMember(x => x.Property1, opt => opt.MapFrom(src => src.ArticleNewsItem.Property1)

すべてのプロパティを からArticleNewsItemDetailsViewModel新しいビュー モデルに移動し、そのクラスを 内のプロパティにすることを考えましArticleNewsItemDetailsViewModelた。これら 2 つのオブジェクト間にマッピングがある限り、それは機能しますが、あまりクリーンではありません。

これを回避する方法はありますか?

4

3 に答える 3

1

次のクラスがあるとします。

    public class Article
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
        public ArticleNewsItem ArticleNewsItem { get; set; }
    }

    public class ArticleDetailsViewModel
    {
        public string Prop1 { get; set; }
    }

    public class ArticleNewsItemDetailsViewModel : ArticleDetailsViewModel
    {
        public string Prop2 { get; set; }
        public string Prop3 { get; set; }
    }

    public class ArticleNewsItem
    {
        public string Prop3 { get; set; }
    }

マッピングは次のようになります。

var res = Mapper.Map<Article, ArticleNewsItemDetailsViewModel>(_article);
Mapper.Map(_article.ArticleNewsItem, res);

さらに、カスタム型コンバーターArticleを作成して、 にマップする必要があるたびにこれらの 2 行を記述することを避けることができますArticleNewsItemDetailsViewModel

于 2012-12-21T00:54:37.673 に答える
0

必要なすべてのプロパティが記事にあると仮定すると、これを行うためにカスタム値リゾルバーを作成できます。

public class ArticleNewsItemResolver : ValueResolver<Article, ArticleNewsItem>
{
    protected override ArticleNewsItem ResolveCore(Article source)
    {
        return Mapper.DynamicMap<Article, ArticleNewsItem>(source);
    }
}
...

CreateMap<Article, ArticleNewsItemDetailsViewModel>()
    .ForMember(src => src.NewsItem, opt => opt.ResolveUsing<ArticleNewsItemResolver>());
于 2012-12-21T01:16:08.023 に答える
0

頭の中でこれを単純化しすぎている場合はお詫びしますが、あなたが言及した直接マッピングを単純に追加することはできません:

CreateMap<ArticleNewsItem, ArticleNewsItemDetailsViewModel>();

私にとって、これは最もシンプルでクリーンなソリューションです...

編集 申し訳ありませんが、誤解しました。.ConstructUsing() または .ConvertUsing() メソッドを介してカスタム マップを作成せずに (または乱雑な方法で) オブジェクトをネストされたプロパティにマップすることはできません...

Mapper.CreateMap<Article, ArticleNewsItemDetailsViewModel>().ConstructUsing(ConstructItem)

..次に、ArticleNewsItemDetailsViewModel を構築するメソッドを作成します...

private static ArticleNewsItemDetailsViewModel ConstructItem(Article source)
    {
        var newsItem = new ArticleNewsItem
                           {
                               Prop1 = source.Prop1,
                               Prop2 = source.Prop2
                           };

        var result = new ArticleNewsItemDetailsViewModel()
                         {
                             ArticleNewsItem = newsItem
                         };

        return result;
    }

ただし、ソリューションを再実装することをお勧めします。これにより、「同様に」マッピングされます。良い例を次に示します: http://automapper.codeplex.com/wikipage?title=Nested%20Mappings

于 2012-12-14T15:39:52.850 に答える