2011-06-25 3 views
4

DataLayerにBusinessEntityがあり、BusinessLayerでユーザーに変換する必要があるとします。これらの2つの型の間に1対1のマッピングはなく、継承はオプションではありません。データオブジェクトからビジネスオブジェクトに変換します。ベストプラクティス

私はUserEntityに変換したい、それ以外の方法で変換します。これを行う最善の方法は何ですか?私はいくつかのパターンを見るが、私はより良いとされているか分からない理由:

  1. ユーザーの2つの方法で実装します。エンティティとToEntityが
  2. 過負荷=演算子をにTypeConverterを実装から

答えて

2

代入演算子をオーバーロードしないでください。これは厄介で、コードを継承するすべての開発者を噛んでしまいます。明示的にする方が良いです。

別のクラスにこれら2つのタイプ(1:1でない場合はそれ以上)をマッピングするロジックをカプセル化します。 ToEntity/FromEntityメソッドを実装できるUserAdapterクラスを作成します。

コード量を最小限に抑えるには、AutoMapperを使用してください。

AutoMapperは、オブジェクトのオブジェクトマッピング 戦略を定義するために、流暢構成 APIを使用します。 AutoMapperは、 の規則に基づいた一致アルゴリズムを使用して、 の送信元と宛先の値を一致させます。 現在、AutoMapperは、その設計 が 間のシリアライゼーション、 通信、メッセージング、または単に 腐敗防止層に適しているのDTO および他の単純なオブジェクトに複雑なオブジェクトモデルを平ら にモデル投影シナリオに向かっ 連動されていますドメインとアプリケーション層。

更新:

あなたはUserクラスにこれらのメソッドを追加することができ、そしてそれは、小規模なプロジェクトのために十分かもしれません。私はデザインになるとちょっと純真だし、アダプタロジックをそれらのクラスの外に保つだろう。 Userクラスが従属し、UserEntityクラスの知識があるのはなぜですか?一緒に縛るのはちょっと匂いがする。アダプターの別のレイヤーは、将来の証明になります。たとえば、データベースレイヤーを別のものに置き換える必要がある場合(つまり、Linq2SQLからEntityFrameworkまたはDapperに移動する必要がある場合)、新しいアダプターを作成するだけです。ビジネスクラスは元のままです。

+0

なぜ、ToEntity/FromEntityをUserクラスに追加しないのですか? – JimK

+0

+1 for AutoMapper。 –

+0

@JimK - 答えを更新しました –