私は次のようなものを含むドメインモデルを持っています:
public class Customer : EntityBase<Customer>, IAggregateRoot
{
public IList<Comment> Comments { get; set; }
}
public class Comment : EntityBase<Comment>
{
public User CreatedBy { get; set; }
public bool Private { get; set; }
}
これらのエンティティを取得するためのサービスレイヤーがあり、そのサービスレイヤーに渡される引数の中には、要求元のユーザーが誰であるかが含まれます。
私がやりたいのは、特定の顧客に返されるアイテムDetachedCriteria
を制限するサービスレイヤーを構築できるようにすることComment
です。これにより、ユーザーには、それらに属さず、プライベートとしてマークされたコメントは表示されません。
私はこのようなことをしてみました:
criteria.CreateCriteria("Comments")
.Add(Restrictions.Or(Restrictions.Eq("Private", false),
Restrictions.And(Restrictions.Eq("Private", true),
Restrictions.Eq("CreatedBy.Id", requestingUser.Id))));
しかし、これは遅延ロードされたコメントには流れません。
フィルタを使用したくないのは、セッション(現在サービスレイヤーに公開されていない)と対話するか、リポジトリにユーザーコンテキストについて認識させる必要があるためです(これは、必要なロジックが多すぎるようです)。ダムレイヤー)。フィルタは、他の理由でも汚い解決策です。何が表示され、何が表示されないかを決定するロジックは、単なるプライベートフラグよりも詳細です。
コレクションをフィルタリングするためにサービスレイヤーでLINQを使用したくないのは、そうすると、遅延読み込みの利点全体が非常に悪い方法で吹き飛ばされるためです。コメントが関連していない顧客のリストは、非常に遅いデータベース呼び出しの嵐を引き起こします。プレゼンテーション層(MVCアプリ)でLINQを使用するのは、間違った場所のように思われるため、使用したくありません。
これが?を使用して可能かどうかのアイデアはありDetachedCriteria
ますか?これを達成する他の方法はありますか?