カタログとユーザーの2つのリポジトリがありますが、ユーザーリポジトリからカタログリポジトリ内のメソッドを呼び出す必要がある状況があります。これは良い習慣ですか、それともより良い方法がありますか?
3 に答える
リポジトリ内でこの種の承認チェックを処理するべきではありません。「このユーザーは投稿するためにXコメントが必要です」のようなビジネスルールは、実際にはリポジトリクエリではなく、ユーザーのプロパティです。
また、承認呼び出しはアプリケーションで非常に頻繁に行われるため、チェックが必要になるたびにデータベースにアクセスする必要はありません。
これらの権限をUserオブジェクトに適切にロードし、現在のリクエスト用にキャッシュして、ドメインを使用する必要があります。
public class Service {
public void Save(Post post)
{
if(User.GetCurrentUser().HasEnoughCommentsToPost())
postRepository.Add(post);
}
}
サービスレイヤーなど、上位レイヤーにある他のリポジトリを参照します
あなたの場合、承認はドメインロジックの一部だと思います。そのため、ドメインレイヤーに、AuthorizationPolicyという抽象クラスまたはインターフェイスを作成します(ドメインに近い名前を見つけることができるかもしれません)。リポジトリのメソッドを呼び出す前に、クライアントは、ポリシーに基づいた権限があるかどうかを確認する必要があります。
別の解決策として、リポジトリのインターフェイスもビジネスロジックの一部であるため、リポジトリの基本クラスを作成して、ユーザーのアクセス許可を確認し、残りを派生クラスに委任することができます。
必要に応じて、AuthorizationPolicyの実装はCatalogクラスと通信します。このようにして、2つのリポジトリは適切に分離されます。