3

ロール テーブル、ユーザー テーブル、および userid、roleid を持つ xref テーブルを使用して、ユーザー認証と承認を実装しようとしています。

ロールの更新、ロールの挿入、ユーザーの追加、ロールへのユーザーの追加、ユーザーの更新、ユーザーロールの更新、ユーザーの認証、監査へのユーザーセッションの追加などを行うための一般的なリポジトリを実装するには、それぞれに個別の関数を作成する必要がありますか、または 1 つの一般的な方法を使用できますか同様の機能のために。ユーザーを他のテーブルに結合し、条件に基づいて上位 5 行を取得する、単一のフォームを使用して 3 つのテーブル (キーで結合) に挿入するなど、他にもいくつかの操作があります。

多くの記事やサンプルを読んで混乱しています。私が目にする bcos サンプルは、CRUD 操作以外の深い実装には入っていません。

誰かが私を案内したり、良いサンプル/記事に誘導したりできますか?

4

3 に答える 3

7

まず、Frank Schwieterman の発言に従ってください。使用量の増加に合わせてリポジトリを拡張します。さらに、IQueryable インターフェイスについて学び、それを利用します。L2S は、Entity Framework、LINQ to nHibernate、および SubSonic や Telerik の ORM などの一部の新しい ORM とともに、すべて IQueryable インターフェイスをサポートしています。

リポジトリからの変更可能なクエリが必要であるが、必要に応じて OR マッパーを交換する利点が必要な場合、IQueryable は強力なツールです。次のようなものと仮定します。

public class ProductRepository: IProductRepository
{
    public Product GetByID(int id);
    public IList<Product> GetAll();
    public void Insert(Product product);
    public Product Update(Product product);
    public void Delete(Product product);
}

これはかなり一般的なリポジトリであり、最低限の一般的なメソッドが含まれています。時間が経つにつれて、さらに多くのメソッドが作成される可能性があります。

public IList<Product> GetByOrder(Order order);
public IList<Product> GetByCategory(Category category);
public IList<Product> GetByQuantityInStock(int quantityInStock);

これもかなり一般的であり、問​​題へのアプローチ方法によっては、完全に受け入れられます。ただし、長期的には、リポジトリは扱いにくいサイズに成長する可能性があり、そのインターフェイスは常に変化します。また、バックグラウンドで OR マッパーを使用することの真の利点も失います。

元の単純なリポジトリ インターフェースを維持できますが、メソッドを 1 つ変更すると、多くの柔軟性が得られます。

public IQueryable<Product> GetAll();

リポジトリは、取得済みのオブジェクトのリストではなく、クエリを返すようになりました。このクエリは、他の LINQ 対応オブジェクトと同様に自由に使用できます。

var productsWithLowStock = productRepository.GetAll().Where(p => p.Quantity < 10);

var orders = orderRepository.GetAll();
var productsWithOrders = productRepository.GetAll().Where(p => orders.OrderLines.Any(ol => ol.ProductID == p.ProductID));

リポジトリで IQueryable インターフェイスの使用を開始すると、両方の長所を活用できます。下位レベルのデータ アクセスに関するモック可能な抽象化と、コード内の動的クエリの機能です。この概念をもう少し進めて、IQueryable 自体を実装するベース リポジトリ クラスを作成すると、GetAll() 呼び出しの必要がなくなり、単純にリポジトリに直接クエリを実行できます (複雑さは増しますが)。

于 2009-10-15T17:13:31.933 に答える
1

理想的には、リポジトリの要件を推測するべきではありません。これを行う 1 つの方法は、最初にリポジトリを使用するコードを記述し、必要に応じてリポジトリのインターフェイスを拡張することです。これは、リポジトリのテスト ダブルを提供する単体テストを作成する場合に達成できます。

于 2009-10-15T16:56:26.337 に答える
-2

linq2sql は一種のアンチパターンである ActiveRecord パターンの実装であるため、リポジトリ パターンを使用する場合は、linq2sql を使用する必要はありませんが、懸念事項を分離できる他の何かを使用する必要があります (エンティティ用の別のクラスとデータ アクセス用の別のクラス) )

またはおそらくあなたは何とかすることができます、私はそれについて知りません:D

于 2009-10-15T16:56:51.800 に答える