93

Are they the same thing? Just finished to watch Rob Connery's Storefront tutorial and they seem to be similar techinques. I mean, when I implement a DAL object I have the GetStuff, Add/Delete etc methods and I always write the interface first so that I can switch db later.

Am I confusing things?

4

12 に答える 12

89

あなたは間違いなく物事を混乱させる人ではありません。:-)

質問に対する答えは、あなたがどれだけ純粋主義者になりたいかによると思います。

厳密な DDD の観点が必要な場合は、1 つの道をたどることになります。リポジトリを、サービスとデータベースを分離するレイヤーのインターフェイスを標準化するのに役立ったパターンと見なすと、別のことができなくなります。

私の観点から見ると、リポジトリはデータへのアクセスの明確に指定されたレイヤーです。つまり、データ アクセス レイヤーを実装するための標準化された方法です。異なるリポジトリ実装にはいくつかの違いがありますが、概念は同じです。

リポジトリに DDD 制約を追加する人もいれば、データベースとサービス層の間の便利なメディエーターとしてリポジトリを使用する人もいます。DAL のようなリポジトリは、サービス層をデータ アクセスの詳細から分離します。

それらを異なるものにしていると思われる実装上の問題の 1 つは、仕様を取るメソッドを使用してリポジトリが作成されることが多いことです。リポジトリは、その仕様を満たすデータを返します。私が見たほとんどの従来の DAL には、メソッドが任意の数のパラメーターを取る、より大きなメソッドのセットがあります。これは小さな違いのように聞こえるかもしれませんが、Linq と Expressions の領域に入ると大きな問題になります。デフォルトのリポジトリ インターフェイスは次のようになります。

public interface IRepository : IDisposable
{
    T[] GetAll<T>();
    T[] GetAll<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter);
    T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
    void Delete<T>(T entity);
    void Add<T>(T entity);
    int SaveChanges();
    DbTransaction BeginTransaction();
}

これは DAL ですか、それともリポジトリですか? この場合、私はその両方を推測します。

キム

于 2008-11-15T20:26:11.860 に答える
44

リポジトリはさまざまな方法で適用できるパターンですが、データ アクセス レイヤーには非常に明確な責任があります。つまり、DAL はデータ ストレージに接続して CRUD 操作を実行する方法を認識している必要があります。

リポジトリは DAL にすることもできますが、DAL の前に配置して、ビジネス オブジェクト層とデータ層の間のブリッジとして機能させることもできます。どの実装が使用されるかは、プロジェクトごとに異なります。

于 2008-11-15T19:03:15.570 に答える
23

大きな違いの1つは、DAOがドメイン内のエンティティの永続性を処理する一般的な方法であるということです。一方、リポジトリは集約ルートのみを扱います。

于 2009-03-05T00:01:25.857 に答える
12

同様の質問に対する回答を探していましたが、上位 2 つの回答に同意します。自分でこれを明確にしようとしたところ、リポジトリ パターンと密接に関連する仕様がドメイン モデルのファースト クラス メンバーとして実装されている場合、次のことができることがわかりました。

  • 仕様定義を異なるパラメータで再利用します。
  • 既存の仕様インスタンスのパラメーターを操作する (たとえば、特殊化するため)。
  • それらを組み合わせ、
  • データベースにアクセスすることなく、それらに対してビジネス ロジックを実行します。
  • そしてもちろん、実際のリポジトリの実装とは別に単体テストを行います。

リポジトリ パターンが仕様パターンと一緒に使用されない限り、それは実際には "リポジトリ" ではなく、DALであるとさえ言えます。疑似コードでの不自然な例:

specification100 = new AccountHasMoreOrdersThan(100)
specification200 = new AccountHasMoreOrdersThan(200)

assert that specification200.isSpecialCaseOf(specification100)

specificationAge = new AccountIsOlderThan('2000-01-01')

combinedSpec = new CompositeSpecification(
    SpecificationOperator.And, specification200, specificationAge)

for each account in Repository<Account>.GetAllSatisfying(combinedSpec)
    assert that account.Created < '2000-01-01'
    assert that account.Orders.Count > 200

詳細については、 Fowler's Specification Essayを参照してください (これが上記のベースになっています)。

DALには、次のような特殊なメソッドがあります

IoCManager.InstanceFor<IAccountDAO>()
    .GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01')

特に、このアプローチで各 DAL/DAO インターフェイスを定義し、DAL クエリ メソッド実装する必要があるため、これがすぐに面倒になることがわかります。

.NET では、仕様を実装する 1 つの方法として LINQ クエリを使用できますが、仕様 (式) を組み合わせることは、自家製のソリューションほどスムーズではない場合があります。そのためのいくつかのアイデアは、この SO Questionで説明されています。

于 2009-06-22T21:41:56.470 に答える
2

私の個人的な意見では、すべてはマッピングに関するものです。 http://www.martinfowler.com/eaaCatalog/repository.htmlを参照してください。したがって、リポジトリからの出力/入力はドメイン オブジェクトであり、DAL では何でもかまいません。私にとって、これは重要な追加/制限です。データベース/サービス/さまざまなレイアウトのリポジトリ実装を追加でき、マッピングの実行に集中できる明確な場所があるからです。その制限を使用せず、別の場所でマッピングを行う場合、データを表すさまざまな方法を使用すると、変更してはならない場所のコードに影響を与える可能性があります。

于 2009-03-05T00:17:03.730 に答える
1

リポジトリはパターンです。これは、コードを可能な限り再利用するための標準化された方法で物事を実装する方法です。

于 2010-05-06T13:27:09.960 に答える
1

外部世界 (つまり、クライアント コード) のリポジトリは、以下を除いて DAL と同じです。

(1) 挿入/更新/削除メソッドは、データ コンテナー オブジェクトをパラメーターとして持つように制限されています。

(2) 読み取り操作の場合、DAL のような単純な指定 (たとえば、GetByPK) または高度な指定が必要になる場合があります。

内部的には、データ マッパー レイヤー (エンティティ フレームワーク コンテキストなど) と連携して、実際の CRUD 操作を実行します。

リポジトリパターンが意味しないもの:-

また、insert/update/delete メソッドによって実行されたすべてのメモリ内変更をデータベースにコミットする Insert/Update/Delete メソッドに加えて、リポジトリ パターンのサンプル実装として別の Save メソッドを使用することに混乱する人もよく見かけます。リポジトリに確実に Save メソッドを含めることができますが、メモリ内の CUD (作成、更新、削除) と永続化メソッド (データベースで実際の書き込み/変更操作を実行する) を分離するリポジトリの責任ではありませんが、 Unit Of Work パターンの責任。

お役に立てれば!

于 2009-12-29T15:25:50.007 に答える
1

リポジトリ パターンを使用する利点は、DAL コードを呼び出さずにビジネス レイヤー コードをテストできるように、データ アクセス レイヤーをモックできることです。他にも大きな利点がありますが、これは私にとって非常に重要なようです.

于 2011-09-26T05:00:25.563 に答える
1

解釈と文脈がすべてです。それらは非常に似ている場合もあれば、実際には非常に異なる場合もありますが、ソリューションが機能する限り、名前の意味は何ですか!

于 2008-11-15T18:53:26.447 に答える
0

(単純な) ほとんどの場合、DAO はリポジトリの実装ですか?

私が理解している限り、DAOはdbアクセスを正確に処理しているようです(CRUD-選択はありませんか?!)が、リポジトリではデータアクセス全体を抽象化でき、おそらく複数のDAO(おそらく異なるデータソース)のファサードです。

私は正しい道を進んでいますか?

于 2008-11-15T20:48:44.170 に答える
0

私が理解していることから、それらは基本的に同じことを意味する可能性がありますが、命名は文脈によって異なります.

たとえば、IRepository インターフェイスを実装する Dal/Dao クラスがあるとします。

Dal/Dao はデータ層の用語です。アプリケーションの上位層は、リポジトリの観点から考えます。

于 2008-11-14T21:43:37.197 に答える
0

「リポジトリ」は特定のクラスであり、「DAL」はリポジトリ、DTO、ユーティリティ クラス、およびその他の必要なもので構成される層全体であると主張できます。

于 2020-01-06T21:16:22.743 に答える