4

私のデータレイヤーには、次のようなアイテムのリストを返すことができるリポジトリがあります。

new List<Item> {
    new Item { Title = "Something", DetailId = 500 },
    new Item { Title = "Whatever", DetailId = 501 },
}

リポジトリには、アイテムの詳細 ID を指定すると、これらのアイテムの詳細を返すことができる別のメソッドがあります。

// repository.GetDetail(500) would return something like:
new ItemDetail {
    Id = 500,
    Size = "Large"        
}

さて、私のサービスレイヤーでは、上記のリストを次のようなものにマップしたいと思います:

new List<ServiceItem> {
    new ServiceItem { Title = "Something", Size = "Large" },
    new ServiceItem { Title = "Whatever", Size = "Medium" },
}

Titleリスト内のオブジェクト (この場合) と詳細オブジェクトの両方のプロパティが必要であることに注意してください。これをAutoMapperでマッピングする良い方法はありますか?

リポジトリのインスタンスに依存するプロファイルを作成し、AutoMapper に詳細リクエストを実行させることを考えましたが、AutoMapper に新しいデータを取得させるのは面倒ですか?

2 つのオブジェクトを 1 つにマップするクリーンな方法はありますか?

4

3 に答える 3

4

1 つの可能性は、Item および ItemDetail オブジェクトをタプルでラップし、そのタプルに基づいてマップを定義することです。マッピング コードは次のようになります。

Mapper.CreateMap<Tuple<Item, ItemDetail>, ServiceItem>()
    .ForMember(d => d.Title, opt => opt.MapFrom(s => s.Item1.Title))
    .ForMember(d => d.Size, opt => opt.MapFrom(s => s.Item2.Size));

正しい Item と ItemDetail を自分で結合する必要があります。Automapper で Item を正しい ItemDetail にも一致させたい場合は、マッピングを変更して、Size の解決中に Automapper がルックアップを実行し、一致する Size を返すようにする必要があります。コードは次のようになります。

Mapper.CreateMap<Item, ServiceItem>()
    .ForMember(d => d.Size, opt => opt.MapFrom(s => itemDetails.Where(x => s.DetailId == x.Id).First().Size));

このマップは、Automapper の自動マッピング機能を使用して、Item.Title を ServiceItem.Title にマップします。マップは itemDetails という名前の IEnumerable を使用して一致を見つけていますが、それをデータベース呼び出しに置き換えることができるはずです。このタイプのルックアップを行うことは、Autmapper が行うように設計されているとは思わないため、多数のアイテムのパフォーマンスはそれほど優れていない可能性があります。それはテストするものです。

于 2012-08-21T20:23:32.720 に答える
2

http://consultingblogs.emc.com/owainwrag/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspxのブログでは、これを行うためのアプローチについて説明しています。入力オブジェクトごとに 1 つの Map() 呼び出しを行いますが、少なくともヘルパーでラップします。

于 2012-08-21T12:21:12.767 に答える
0

AutoMapperの代わりにValueInjecterを使用すると、2つを簡単に切り替えることができ、ValueInjecterは、箱から出して複数のソースから値を注入することをサポートします。

serviceItem.InjectFrom(item);
serviceItem.InjectFrom(itemDetail);

ボーナスとして、AutoMapperのようにすべての静的マッピングを行う必要はありません。

于 2012-08-21T20:26:43.863 に答える