2013-01-11 28 views
6

私はこの問題のためのベストプラクティスを探してEFで問題のビットに実行しました:TestEntityFramework_UOWImplementation()メソッドではユニット、Entity FrameworkのDBContextスコープ

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); 

} 

、その罰金、私自分の作業ユニットのスコープを作成し、その内部にリポジトリを作成します。

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

この問題を回避するにはどうすればよいですか?

ありがとうございます!

ニール

+1

'でインスタンスメソッドであるGetMaterial'べきではありません'MaterialRepository'クラス? –

+0

thats良い点! :)しかし、あなたがWhere()をやりたいと思っていたものがあったと言います。これらもまたレポになると思います。ありがとう!今私はそれが明らかに書かれていることを確認します:) –

+0

実際に、いくつかのRepoクエリが必要だったと言います。あなたは、質問がレポの外で行われるケースがあるとは思わないでしょうか? または、CalculateMaterialPrices()というメソッドがあり、計算するためにMaterialsのリストが必要でした。TestEntityFramework_UOWImplementation()メソッドまたはCalculateMaterialPrices()メソッドでrepo GetMaterials()メソッドを呼び出しますか?後者の場合、どのようにレポにアクセスしますか?または私はここで正しい道にはない! –

答えて

0

誰かがこれを回避する方法を探していたら、私は少し違ったことをしました。

すべてのDIを処理するためにDependency Injectionフレームワーク(StructureMap)を使用したので、リポジトリをインスタンス化するたびにStructure MapのService LocatorからDBContextを取得します。また、dbcontextスコープをWebサーバーからの要求の持続時間にするようにします。

ここでの利点は、DBContextを取得または挿入するたびに、要求の継続時間に同じコンテキストが取得されるということです。これは複数のメソッドとクラスにわたって使用できます。私はジェネリックパラメータとしてコンストラクタにインターフェイス型を渡します。つまり、私は異なるコンテキストとしてレポを指すことができます。 dbcontextがたくさんあるアプリケーションで役に立ちます。

レポコンストラクタ例:

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>(); 
+0

私は意見に興味があります! –

3

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

リポジトリパターン、作業単位、およびEF hereが、詳細を読むことができ、基本的に私は私のサービスクラスのコンストラクタで、私はそうのような作業単位を注入されて何をすべきか:次に

private readonly IUnitOfWork uow; 

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

Iサービス内のどこでも私のreposでuow.WhateverMethodを使うことができます。私はNinjectを使ってIUnitOfWorkの注入を処理します。それがあなたを助けることを願ってください。

関連する問題