Automapperの目的は何ですか?
ドメインとコントローラー層 (asp.net mvc) でどのように役立ちますか?
ここで例が役立つかもしれません...
次のような適切に正規化されたデータベース スキーマがあるとします。
注文 (OrderID、CustomerID、OrderDate) 顧客 (顧客 ID、名前) OrderDetails (OrderDetID、OrderID、ProductID、Qty) 製品 (ProductID、ProductName、UnitPrice)
そして、よく組織化されたドメイン モデルを返す素晴らしい O/R マッパーを使用しているとしましょう。
注文詳細 +--ID +--注文 |--+--日付 |--+--顧客 |-----+--ID |-----+--名前 +--製品 |--+--ID |--+--名前 |--+--単価 +--数量
ここで、先月注文されたものすべてを表示する必要があります。これをフラット グリッドにバインドしたいので、バインドするフラット クラスを忠実に記述します。
public class OrderDetailDto
{
public int ID { get; set; }
public DateTime OrderDate { get; set; }
public int OrderCustomerID { get; set; }
public string OrderCustomerName { get; set; }
public int ProductID { get; set; }
public string ProductName { get; set; }
public Decimal ProductUnitPrice { get; set; }
public int Qty { get; set; }
public Decimal TotalPrice
{
get { return ProductUnitPrice * Qty; }
}
}
これまでのところ、それはかなり痛みがありませんでしたが、今はどうですか?データバインディングのためOrderDetail
に、 の束を の束に変えるにはどうすればよいでしょうか?OrderDetailDto
を受け取るコンストラクターを配置しOrderDto
、OrderDetail
マッピング コードを大量に作成する場合があります。または、静的変換クラスがどこかにあるかもしれません。または、AutoMapper を使用して、代わりに次のように記述できます。
Mapper.CreateMap<OrderDetail, OrderDetailDto>();
OrderDetailDto[] items =
Mapper.Map<OrderDetail[], OrderDetailDto[]>(orderDetails);
GridView1.DataSource = items;
そこには。無意味なマッピング コードのうんざりするようなごちゃまぜになっていたものを、3 行に減らしました (実際のマッピングでは、実際には 2 行だけです)。
それは目的を説明するのに役立ちますか?
あるタイプのオブジェクトがあり、最初のタイプのプロパティを使用して別のタイプのオブジェクトのプロパティを設定する場合は、次の 2 つの選択肢があります。
AutoMapper は 2 の例です。
最も一般的な用途は、モデルをデータ転送オブジェクトにフラット化することです (または、一般に、レイヤーの境界を越えてマッピングします)。AutoMapper の非常に優れた点は、一般的なシナリオでは構成を行う必要がないことです (構成よりも規約)。
レイヤー間でオブジェクトをマップします。良い例:ここ