19

これまで、すべての C# データベース駆動型アプリケーションでアクティブ レコードを使用してきました。しかし今、私のアプリケーションでは、永続化コードをビジネス オブジェクトから分割する必要があります。Martin Fowler のデータ マッピング パターンに関する多くの投稿を読みましたが、このパターンに関する知識はまだ非常に限られています。

次の例を使用してみましょう。

Customer と CustomerParameters の 2 つのテーブルがある場合。CustomerParameters テーブルには、新しい Customer を作成するためのデフォルトの Customer 値が含まれています。

次に、すべての Customer 永続性を処理する CustomersMapper クラスを作成する必要があります。My Customer および CustomersList クラスは、顧客データを永続化するために、このマッパー クラスと連携します。

次の質問があります。

  1. 特定のビジネスルールに違反することなく、生データを TO & FROM my Customer クラスからマッパーに転送するにはどうすればよいですか? DTOの?

  2. 複数の顧客のデータを更新およびロードするために、Mapper クラスに SaveAll および LoadAll メソッドを含めることは許容されますか? その場合、SaveAll の場合、マッパーはデータを更新または挿入するタイミングをどのように知るのでしょうか?

  3. Customer マッパー クラスは、CustomerParameters テーブルからもデフォルト値を取得しますか? それとも CustomerParameters マッパーを作成した方がよいでしょうか?

AO/R マッパー ツールは実際にはここにはありません。私が使用しているデータベースはトランザクション型で、独自のマッパー パターンを作成する必要があります。

アイデアやコメントは大歓迎です。

4

3 に答える 3

12

Shaun 私はあなたの質問に次のように答えます。

ad 1) Mapper は Customer オブジェクトの作成を担当します。Mapper オブジェクトには、RetrieveById メソッドのようなものがあります (たとえば)。ID を受け取り、有効な Customer オブジェクトを構築します (これは Mapper オブジェクトの責任ではありません)。同じことが他の方法にも当てはまります。有効な Customer オブジェクトを使用して Mapper.Update メソッドを呼び出すと、Mapper オブジェクトは、すべての関連データが永続化されていることを確認する責任があります (適切な場所 - db、メモリ、ファイルなど)。

広告 2) 上で述べたように、retrieve/persist は Mapper オブジェクトのメソッドです。そのような機能を提供するのは、その責任です。したがって、LoadAll、SaveAll (おそらく値オブジェクトの配列を渡す) は有効な Mapper メソッドです。

広告 3) そうです。ただし、Mapper オブジェクトのさまざまな側面を個別のクラスに分けることができます (必要な場合): デフォルト値、ルール検証など。

お役に立てば幸いです。Martin Fowler の著書Patterns of Enterprise Application Architectureを読むことを強くお勧めします。

于 2009-03-09T18:44:54.017 に答える
0

NHibernate の代替として iBATIS.NET をチェックアウトできます。これも O/R ツールですが、NHibernate よりも少し使いやすいことがわかりました。

http://ibatis.apache.org/

于 2009-03-09T20:25:57.380 に答える
0

Data Mapper パターンを自分で実装する前に、O/R-mapper ツールを確認することをお勧めします。時間を大幅に節約できます。O/R マッパーの一般的な選択肢はNHibernateです。

于 2008-10-16T08:26:19.097 に答える