6

この問題のベスト プラクティスを探している EF で少し問題が発生しました。

public void TestEntityFramework_UOWImplementation()
{
    using (UnitOfWorkInventory uow = new UnitOfWorkInventory())
    {
        IMaterialRepository repos = new MaterialRepository(uow);

        Material mat = GetMaterial("Mikes Material", 1);

        mat.CostPrice = 20;

        repos.InsertOrUpdate(mat);

        uow.Commit();
    }
}

private Material GetMaterial(string sku, int clientId)
{
    IMaterialRepository repos = new MaterialRepository(new UnitOfWorkInventory();

    return repos.Find(sku, clientId);

}

TestEntityFramework_UOWImplementation() メソッドでは、うまくいきました。自分の作業単位のスコープの作成を呼び出し、その中にリポジトリを作成します。

しかし、以下のように getMaterials() を実行したい場合は、実際にパラメーターとして渡さない限り、作業単位またはリポジトリにアクセスできません! これは明らかに特に良いことではありません。

人々はこの問題をどのように回避しますか??

前もって感謝します!

ニール

4

2 に答える 2

3

あなたの実装では、そのような作業単位にアクセスすることはできません。私がやっていることは、IoC コンテナーと依存性注入を使用してそれを処理することです。Unit of Work を EF5 に対するリポジトリ パターンで使用する WCF サービスがあります。

リポジトリ パターン、作業単位、および EF の詳細については、こちらを参照してください。ただし、基本的には、サービス クラスのコンストラクターに次のように作業単位を挿入します。

    private readonly IUnitOfWork uow;

    public LoanService(IUnitOfWork unitOfWork)
    {
        uow = unitOfWork;
    }

次に、サービス内の任意のリポジトリで uow.WhateverMethod を使用できます。IUnitOfWork の注入を処理するためにNinjectを使用します。お役に立てば幸いです。

于 2013-01-25T20:19:12.480 に答える
0

誰かがこれを回避する方法を探していた場合、私は少し違うことをしました.

依存性注入フレームワーク (StructureMap) を使用してすべての DI を処理したため、リポジトリをインスタンス化するたびに、StructureMap の Service Locator から DBContext が取得されます。また、dbcontext スコープを、Web サーバーからの要求の間だけにします。

ここでの利点は、DBContext を取得または挿入するたびに、リクエストの期間中同じコンテキストを取得することです。これは、複数のメソッドとクラスでこれを使用できることを意味します! インターフェイス型を汎用パラメーターとしてコンストラクターに渡します。つまり、レポを別のコンテキストとして指すことができます。多くの dbcontexts があるアプリケーションで役立ちます。

レポ コンストラクター 例:

public class PurchaseOrderRepository<TDbContext> : GenericRepository<PurchaseOrder>, IPurchaseOrderRepository<TDbContext> where TDbContext : DbContext
{

        public PurchaseOrderRepository()
            : base((TDbContext)ObjectFactory.GetInstance<TDbContext>())
        {
        }
}   

使用法:

 //resolves the request scope InventoryContext... 
var pRepos = new PurchaseOrderRepository<IInventoryContext>();

構造マップの依存関係は次のようになります。

    For<IInventoryContext>().HttpContextScoped().Use<InventoryContext>();
于 2013-01-28T09:16:23.260 に答える