2009-04-17 2 views
1

私はドメインマッファーでFowlerパターンを利用しており、CRUDの作成部分の実装方法についていくつか混乱しています。基礎となるデータソースはカスタムシステムであるため、既存のORMテクノロジを利用することはできません。 私に悩まされている領域は、新しいオブジェクトを作成する必要があるときに、下にあるORMを呼び出す方法です。私のドメイン層には私のファインダーを除いて私のORMの可視性はありません。Fowlerデータマッパーオブジェクトの作成

私は正しい軌道に乗ってるのかはわからないけど、次は私が見ることができる唯一のオプションは以下のとおりです。

  1. 作成機能にファウラーファインダが行われ、同じように処理します。 ORMクラスの作成メソッドについて、ドメインモデルレイヤーにインターフェイスを作成します。ドメインモデルでDIコンテナを呼び出し、そのインタフェースに基づいてORMクラスのインスタンスをインスタンス化します。

  2. ORMのオブジェクトAの水和中に、オブジェクトBのORMの作成メソッドを指すデリゲートをアタッチします。ドメインオブジェクトAを要求するとオブジェクトAのデリゲートを呼び出すことができます。 Bのマッパー。

  3. ???

これは複雑ではないため、私は何かを間違っていなければなりません。 ご協力いただければ幸いです。

おかげ

答えて

2

どうオームズは、この問題を解決する方法を見てどうですか?オブジェクトの動的作成をサポートする言語では、データオブジェクトとドメインオブジェクトの関連付けの「マッピング」が別の構成として提供されます。クラスは、リフレクションまたはバイトコードライブラリを使用して作成されます。私はそれがデータマッパーをどのように一般的に作りたいかによって決まると思います。元のパターンから収集できるものから、ドメインオブジェクトごとにデータマッパーが存在することができます。

おそらく、あなたは一般的な解決策を試しています。それ以外の場合は、リフレクションを使用してオブジェクトを構築する方法に関する情報で一般的なマッパーを設定することです。

ORM層は、CanonicalClass名+これらのクラスで期待されるメソッドのリストを表す文字列を扱うことができます。

永続化するオブジェクトを渡すと、この情報を使用してオブジェクトを検査できます。オブジェクトの作成は、データベースからのデータを使用してリフレクションを使用して行うことができます。一部のORMソリューションでは、深い方法でオブジェクトツリーを作成するのではなく、遅延フェッチ用のプロキシを作成することがあります。

1

問題がタイプAからタイプBにマッピングされている場合は、AutoMapperと考えてください。

0

再:あなたがAGGREGATE ROOTとリポジトリパターンの考え方に「どのように私は新しいオブジェクトを作成する必要がある場合に根本的なORMを呼び出すために」

を見たことが - 彼らは役に立つかもしれません。

概要: AGGREGATE ROOTは、システム内でグローバルに一意のIDを持つ「エンティティ」です。たいていの場合、これらはアプリケーションが 'id'をつかむ必要がある唯一のオブジェクトです。それらは、アプリケーションスタートアップ/ブートストラップ時に、一般的にに、のデータレイヤーで初期化されているREPOSITORYで検出されます。

アグリゲーションルートのファクトリは、一般に、アプリケーション起動/ブートストラップ時のデータレイヤーについては、knowに初期化されています。

REPOSITORYは、任意の方法でオブジェクトのデータを掘り起こすプロセスを仲介できます。 REPOSITORYは、生データを取得するためにdatalayer/mapperに委譲し、建物を行うためにFACTORY(クラス/メソッド)にオブジェクト再構成の実際のジョブを委託する傾向があります。REPOSITORYは、新しく再構成されたAGGREGATE ROOTオブジェクト、 of)を、REPOSITORYのfindメソッドを呼び出したクライアント、つまりアプリケーションに渡します。 REPOSITORYは、AGGREGATE ROOTを検索して保存するインターフェイスで、メモリ内に格納されている動作を示します。

しかし、アプリケーションは、新しいAGGREGATE ROOTオブジェクトを作成するために、FACTORYを直接使用することがあります。

AGGREGATE ROOTのFactoryは、ORM/Mapper Layersに関する優れた知識を持ち、新しいエンティティの作成時に、ある種の 'number sequence object'のサービスを呼び出して固有IDを取得することがあります。

AGGREGATE根は、一般的にあなたが他のドメインオブジェクトは、どちらかであるため、「世界的に知られているIdで検索」する必要があるドメインオブジェクトの唯一の種類があります:

  • 使い捨て値オブジェクト - お金の価値のように、OR
  • 「全体ルートに依存する」エンティティ。私。
    • AGGREGATE ROOTは実際にそれを見つける必要がある唯一のものでなければならないことを意味しAGGREGATEのROOTのコンテキスト内でのみ一意であるIDを持つオブジェクトは、/それを使用する - 内部
    • 彼らはで見つけることができます
    • そのIDがそのコンテキスト/スコープを定義AGGREGATEのROOTによって作成することができるAGGREGATE根のORMマッパーを使用

参考資料:

ドメイン駆動設計、Eric Evansを参照してください。

集約ルート: http://books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

Repositroies: http://books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=domain%20driven%20design&pg=PA147#v=onepage&q=&f=false

0

リチャードはAutoMapperをチェックアウト示唆したように、あなたは、.NETで実装している場合。 Javaで実装する場合は、ModelMapperをチェックしてください。

関連する問題