0

データマッパーは、オブジェクトとデータベースの間でデータを移動する一方で、オブジェクトとマッパー自体からの独立性を維持するマッパーのレイヤーです。

リポジトリは、ドメインオブジェクトにアクセスするためのコレクションのようなインターフェイスを使用して、ドメインとデータマッピングレイヤーの間を仲介します。

したがって、データマッパーの主な仕事は、オブジェクトテーブル行の間のマッピングを実行し、ドメインデータベースを互いに独立させておくことです。一方、主な仕事またはリポジトリは、永続性レイヤーのオブジェクト指向ビューを提供し、維持することです。永続性レイヤーから完全に独立したドメインレイヤー

a)私が知る限り、データマッパーリポジトリの両方が永続層を抽象化しますが、唯一の違いは、リポジトリが永続層のオブジェクト指向ビューを提供することです。

b)ほとんどの実装では、リポジトリはデータマッパーレイヤーの最上位にありますが、次の実装(「エンタープライズ向けネットソリューションの設計」の本から)では、データマッパーリポジトリの両方と同じインターフェイスが機能します(したがって、永続性もマスクされます)コレクションとしてのレイヤー):

public interface IDataMapper<T>
{
/* Persistence */
void Create(T item);
void Update(T item);
void Delete(T item);

/* Repository */
IList<T> GetAll();
IList<T> GetAll(int index, int size);
int GetCount();
int GetCount(Query query);
T GetByKey(object key);
IList<T> GetByCriteria(Query query);
IList<T> GetByCriteria(Query query, int index, int size);
string TranslateQuery(Query query);
}

リポジトリがデータマッパーレイヤーの上にあるデザインと比較して、そのようなデザインの長所/短所は何ですか?

ありがとうございました

4

2 に答える 2

3

そのコードは、多くの機能を備えた大きなインターフェイスではなく、明確に定義された小さなインターフェイスを作成する必要があるという基本的なインターフェイス分離の原則に違反しています。

この動機はそれをよく説明しています:

ここに画像の説明を入力してください
(出典:lostechies.com

単純なUSBインターフェースの代わりに、多くの高度な機能を備えた一流のボックスを手に入れることができます(これは実装が非常に困難です)。

インターフェイスを小さく保つ必要がある理由は、インターフェイスが各実装者にすべてのメソッドを実装するように強制するためです(リスコフの置換原則に違反したい場合を除く)。

したがって、それを分割し、代わりにクラスに両方のインターフェースを実装させます。

于 2012-10-16T05:41:15.417 に答える
1

@jgauffinがインターフェースを分離する必要があると言ったとき、私は同意します。ただし、インターフェイスを外部のモジュール/アプリにエクスポートしていないことが確実な場合(ただし、インターフェイスは他のユーザーによって使用される可能性が高くなります...そのため、インターフェイスです)、他の誰もがそうではないことも確認できます。それを実装しようとすると、それはあなた自身のコードだけであり、あなたのコードでさえマッパーをリポジトリから分離したくないでしょう、あなたはトレードオフしてそれらを組み合わせることができます。それはよりコンパクトなコードにつながる可能性があります...そしておそらくより緊密なまたは強制的な結合につながる可能性があります。これらが特定の状況で有利である可能性がある場合、おそらくそれがアーキテクチャの本の著者がそのようにした理由です。

ただし、繰り返しになりますが、@ jgauffinによって提案されているように、インターフェイスを分離するのが最善の方法だと思います。将来必要になる可能性のあるインターフェイスと拡張機能のクライアントについては確信が持てません。インターフェイスを分離すると、より保守可能で拡張可能なコードが生成されます。

于 2012-10-16T06:02:31.867 に答える