3

私はリポジトリ パターンとサービス レイヤーの役割について多くのことを読んできましたが、2 つの違いをよく認識しています (と思います)。しかし、単純な問題で、しばらく頭を悩ませています。

データアクセスレイヤーがどのようにデータにアクセスするかをよく知っています...データにアクセスするため、典型的なリポジトリには挿入、更新、削除、保存などのメソッド(基本的なCRUDメソッド)があります。サービス層には、すべてのビジネス要素、検証、電子メールの送信、およびすべてのジャズが含まれています。私が読んだことの1つは、このセットアップは価値を追加しないため、サービス層はリポジトリメソッドを繰り返すべきではないということでした.

しかし、私の問題は「追加」メソッドにあります。たとえば、サプライヤ クラスがあり、特定のサプライヤをサプライヤ リストに追加したいとします。ユーザーが UI (MVC Web アプリ) を介してサプライヤー情報を入力すると、Createコントローラー メソッドが呼び出されます。

このサプライヤを維持するために、コントローラは何を処理する必要がありますか?

  • リポジトリを直接
  • サービス層

純粋なリポジトリの実装はエンティティを永続化する以外に何もしないため、検証やビジネス ルールがある場合は、明らかにサービス レイヤーを使用する必要があります。しかし、コントローラーがリポジトリを直接処理する必要がない場合はどうなりますか? これは、アーキテクチャの層状の性質を壊しているかのように私には思えます。コントローラーはサービス レイヤーをスキップし、永続レイヤーと通信しています。

安全な側にいて、サービスレイヤーを使用したいとしましょう(サプライヤーとの取引に関連する検証やその他のものがある可能性があるため)。私は次のようになります:

  • AddSupplier メソッド
  • UpdateSupplier メソッド
  • DeleteSupplier メソッド

これは、サービス層とデータ アクセス層との 1 対 1 のメソッド マッピングがあるため、最初から望んでいなかったことです。

私の質問は次のとおりです: (Add | Update | Delete)Supplier メソッドはどこに行くべきですか?

また、サービス層をバイパスして、コントローラから直接リポジトリ層と通信しても問題ありませんか?

4

1 に答える 1

2

考慮すべき多くの要因があるため、あなたの質問に対する決定的な答えは1つではないと思います(あなたが指摘したように、それは少しパラドックスでもあります)。最良の実装には、いくつかの重要な部分があると思います。

  1. データソースとやり取りし、基本的なCRUDメソッドの挿入、更新、削除を実行する非常に汎用的なリポジトリ(指摘したとおり)。アプリ全体で対話が一貫するように、これは一般的な方法で行うのが最適です。たとえば、 のような単一のエンティティを返すメソッドT Single(Func<T, bool> where)

  2. ビジネス機能をカプセル化するメソッドを含む特定のビジネス サービス。これらのサービスは、リポジトリとの対話が許可されている唯一のサービスです。「Hello World」スタイルの例を超えて、これらのメソッドは単純に項目を追加または削除するだけでなく、2 つ以上のエンティティと対話し、複雑なビジネス ロジックを実行する可能性があります。たとえば、サービス メソッドは 'CreateAccount' または 'RemmoveBlogPost' である可能性があり、これには単一のエンティティを単に追加したり削除したりする以上のことが必要になることは間違いありません。

  3. 事実上ロジックを実行せず、必要に応じてサービス メソッドを呼び出すだけの「シン」および「ダム」コントローラ。コントローラーは、変数を消費して応答を返すだけです。ただし、各コントローラー アクションでさまざまなサービス メソッドを呼び出すことができます。サービス メソッドを組み合わせて再利用することで、効率的で DRY なコーディング プラクティスが実現します。

この方法論は、あるメソッドの全部または一部をアプリの別の部分で実行したいことに気付いたときにその強みを発揮します。たとえば、ブログ アプリを構築している場合、アプリの公開側には単一のブログ投稿を表示する方法が必要であり、管理者側にもそれが必要であることがわかる場合があります。この単純な例では、Id によってブログ投稿を返すことが各コントローラーで繰り返されますが、getBlogPostById というサービス メソッドを 1 つ作成すると、両方のコントローラーでロジックを再利用できます。

于 2012-08-14T00:27:22.323 に答える