4

ASP.NET MVC と、データ アクセス用のリポジトリ パターンを使用する Entity Framework を使用して Web アプリケーションを実装しています。このアプリケーションには、オブジェクトを作成する関係のない複数のユーザーがいます。各ユーザーは、自分のオブジェクトにのみアクセスできる必要があります。

ユーザーが自分のレコードのみにアクセスできるようにする方法を提供するパターン、または組み込みの EF 機能はありますか?

私は現在、所有者フィールドをすべてのプライベート ドメイン オブジェクトに追加し、DB へのすべてのクエリが通過しなければならないクラスを実装することを考えています。このクラスは、クエリ対象のドメイン オブジェクトがプライベートかどうかを判断します。その場合、このクラスは所有者のフィルターをクエリに追加します。これは合理的に聞こえますか?

4

1 に答える 1

2

質問の 2 番目の部分は、リポジトリ パターンの説明に非常に近いものです。このアプローチを使用して、ユーザー固有のフィルターの挿入を強制することにより、レコードごとのアクセスの問題に対処できます。

このアプローチは、クライアントのビジネス ロジックを行ベースのセキュリティの実装から分離します。後でレコード単位のアクセスを実装する方法を変更することにした場合、変更する必要があるのはリポジトリの実装だけです。クライアントは再コンパイルする必要さえありません。

EF は、すべてのビジネス エンティティのリポジトリを部分クラスとして定義します。その上に (別のファイルで) インターフェイスを追加し、EF によって生成されたメソッドを使用してリポジトリのメソッドを実装できます。

IMyRepository {
    IQueryable<ClientOrder> Orders;
    IQueryable<ServiceIssue> Issues;
}

// The other part of MyRepository is EF-generated.
// Assume that EF provides properties these properties:
// - ObjectSet<ClientOrder> AllOrders 
// - ObjectSet<ServiceIssue> AllIssues 
public partial SecureRepository : IMyRepository {
    private readonly Guid userId;
    public SecureRepository(Guid userId) : this() {
        this.userId = userId;
    }
    public IQueryable<ClientOrder> Orders {
        get {
            return AllOrders.Where(ord => ord.UserId == userId);
        }
    }
    public IQueryable<ServiceIssue> Issues {
        get {
            return AllIssues.Where(csi => csi.UserId == userId);
        }
    }
}

UserIdデータベースに保存する前に、注文と問題に設定する書き込みメソッドを追加できます。

于 2012-06-01T18:08:33.527 に答える