91

DTOをドメイン オブジェクトにマッピングすることに関連する多くの質問を見てきましたが、それらが私の質問に答えているとは思いませんでした。私は以前に多くの方法を使用しており、独自の意見を持っていますが、もう少し具体的なものを探しています.

状況:

多くのドメイン オブジェクトがあります。CSLA モデルを使用しているため、ドメイン オブジェクトは非常に複雑になり、独自のデータ アクセスが含まれます。これらをネットワーク上で渡したくありません。さまざまな形式 (.Net、JSON など) でデータを返す新しいサービスを作成する予定です。このため (およびその他の理由から)、ネットワーク上でやり取りする無駄のないデータ転送オブジェクトも作成しています。

私の質問は、DTO とドメイン オブジェクトをどのように接続する必要があるかということです。

私の最初の反応は、Fowler の DTO パターン型ソリューションを使用することです。私はこれが何度も行われるのを見てきましたが、それは私にとって正しいと感じています. ドメイン オブジェクトには、DTO への参照が含まれていません。ドメイン オブジェクトから DTO を作成するために、外部エンティティ (「マッパー」または「アセンブラー」) が呼び出されます。通常、ドメイン オブジェクト側にORMがあります。これの欠点は、「マッパー」が実際の状況で非常に複雑になる傾向があり、非常に壊れやすい可能性があることです。

もう 1 つのアイデアは、ドメイン オブジェクトに DTO を「含める」ことです。ドメイン オブジェクト プロパティは、DTO プロパティを内部的に参照し、要求された場合に DTO を返すことができます。これで問題はないと思いますが、気分が悪いです。NHibernateを使用している人がこの方法を使用しているように見える記事をいくつか見ました。

他の方法はありますか?上記の方法のいずれかを使用する価値はありますか? そうである場合、またはそうでない場合、その理由は何ですか?

4

10 に答える 10

44

ドメインと DTO の間にマッパーを配置する利点は、サポートするマッピングが 1 つだけの場合にはそれほど顕著ではありませんが、マッピングの数が増えるにつれて、そのコードをドメインから分離することで、ドメインをよりシンプルで無駄のない状態に保つことができます。余分な重みでドメインを乱雑にすることはありません。

個人的には、自分のドメイン エンティティからマッピングを除外し、「マネージャー/サービス レイヤー」と呼ばれるものに責任を負わせようとしています。これは、アプリケーションとリポジトリの間に位置するレイヤーであり、ワークフロー調整などのビジネス ロジックを提供します (A を変更する場合、サービス A がサービス B と連携するように B も変更する必要がある場合があります)。

可能性のあるエンディング形式がたくさんある場合は、Visitor パターンを使用してエンティティを変換するなど、プラグイン可能なフォーマッタを作成することを検討するかもしれませんが、これほど複雑なものの必要性はまだ見つかっていません。

于 2009-03-24T16:47:52.050 に答える
24

Jimmy Bogard によって書かれたものなど、オブジェクト間に接続がなく、命名規則に従うことに依存するオートマッパーを使用できます。

于 2009-03-24T16:41:44.390 に答える
7

T4テンプレートを使用してマッピングクラスを作成します。

Pro's-コンパイル時に利用可能な人間が読めるコードで、ランタイムマッパーよりも高速です。コードを100%制御(部分的なメソッド/テンプレートパターンを使用して、アドホックベースで機能を拡張できます)

短所-特定のプロパティ、ドメインオブジェクトのコレクションなどを除き、T4構文を学習します。

于 2011-12-02T09:40:17.763 に答える
4

ドメイン オブジェクトをパラメーターとして受け取るコンストラクターを DTO クラス内に実装するにはどうすればよいでしょうか。

言って…こんな感じ

class DTO {

     // attributes 

     public DTO (DomainObject domainObject) {
          this.prop = domainObject.getProp();
     }

     // methods
}
于 2014-06-25T14:23:53.940 に答える
1

別の可能な解決策: http://glue.codeplex.com

特徴:

  • 双方向マッピング
  • 自動マッピング
  • 異なるタイプ間のマッピング
  • ネストされたマッピングとフラット化
  • リストと配列
  • 関係の検証
  • マッピングのテスト
  • プロパティ、フィールド、およびメソッド
于 2011-04-22T08:37:05.357 に答える
0

オブジェクト間マッパーであるOtisを試すこともできます。概念はNHibernateマッピング(属性またはXML)に似ています。

http://code.google.com/p/otis-lib/wiki/GettingStarted

于 2009-06-30T21:22:42.647 に答える
0

私が作成し、CodePlex: EntitiesToDTOsでホストされているオープン ソースのツールを提案できます。

DTO からエンティティへのマッピング、およびその逆のマッピングは、拡張メソッドによって実装されます。これらは、各エンドのアセンブラー側を構成します。

次のようなコードで終了します。

Foo entity = new Foo();
FooDTO dto = entity.ToDTO();
entity = dto.ToEntity();

List<Foo> entityList = new List<Foo>();
List<FooDTO> dtoList = entityList.ToDTOs();
entityList = dtoList.ToEntities();
于 2012-09-07T23:46:51.750 に答える
0

別のオプションは、ModelProjectorを使用することです。考えられるすべてのシナリオをサポートし、最小限のフットプリントで非常に使いやすいです。

于 2018-08-08T15:15:23.427 に答える