インターネットでいくつかの記事をグーグルで検索し、この件に関する記事をいくつか見つけましたが、どれも満足のいくものではありませんでした. object-object mapper を使用してオブジェクトを相互にマッピングするのは良いことですか? 使うシチュエーションにもよるとは思いますが、どのように使えば良い、ベストなシチュエーションになるのでしょうか?
2 に答える
@Brad Christie の回答に加えて、異なる方法で生成された他の製品と一緒にビューに表示することを意図している場合、単一の包括的なタイプにわずかな違いがあるタイプを自動マッピングする方が一般的に簡単です。
私自身の以前の回答を引用させていただける場合は、以下に例を示します。
class SingleProduct {
string Name {get;set;}
decimal Price {get;set;}
decimal GetActualPrice() { return Price; }
}
class ComboSaleProduct {
string Name {get;set;}
List<SingleProduct> ComboProducts {get;set;}
decimal GetActualPrice() { return ComboProducts.Sum(p => p.GetActualPrice()); }
}
class ProductViewModel {
string Name {get;set;}
decimal ActualPrice {get;set;}
}
Automapper はすべてを結び付けて、これらのいずれかを返すことができるようにし、ビューモデルの「GetActualPrice」を ActualPrice に自動的にマップします。
一歩下がって、データ転送オブジェクト (DTO) とビュー モデル (VM) をビジネス オブジェクト (エンティティなど) から分離することがベスト プラクティスです。その点で、マッピング ライブラリは目的を達成するための手段であり、その関連付けを簡単にするだけです。
いつまで、それはあなた次第です。維持しやすい方法でビジネス モデルと DTO/VM の間を変換できると思われる場合は、先に進んでください。私の個人的な経験からすると、それは限界にすぎません (特に要件が変化する場合)。したがって、私はライブラリのマッピングが好きです (特に AutoMapper が API であることを知っており、プラグインすることに慣れているため)。
そうは言っても、これら 2 つのモデルの間を行き来する必要があるときはいつでも AutoMapper を使用します。一度設定するだけで、すぐに実行できます。これらのバインディングを 1 か所 (マップ定義ファイル) で変更でき、メソッドが自動的に「追いつく」ことができるため、モデル (両側) への追加の微調整が容易になります。
例:
私のデータベースには製品のレコードが含まれています:
class Product
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public int QuantityOnHand { get; set; }
public int? ReorderQuantity { get; set; }
public string Sku { get; set; }
}
これをより洗練された形式で UI に提示することができます。
public class ProductViewModel
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public int Quantity { get; set; }
}
これが何らかのリポジトリからのものである場合は、次のように呼び出します。
var model = Mapper.Map<ProductViewModel>(productFromRepository)
ここでは、要求した Product から、気になるビュー モデルを一貫して取得します。ビジネス/サービス層がプロパティを追加/変更/削除する場合、定義に戻るだけでMapper.CreateMap<Product, ProductViewModel>()
、残りのプレゼンテーション ロジックはそのまま残ります。