2011-08-10 1 views
1

私は、次の一般的なリポジトリがあります。処分コンテキスト

public class BaseBLL <TEntity> 
     where TEntity : class 
    { 
     protected MyEntities Context { get; set; } 

     public BaseBLL() 
     { 
      this.Context = DataAccessHelper.Context; 
      this.Context.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly); 
     } 
    } 
:これは、ビジネス層ここ

public class UserBLL : BaseBLL<User> 
{ 

    EFRepository<User, MyEntities> userRepo = null; 

    public UserBLL() : base() 
    { 
     //Context is created in the consructor of the base class and passed to repository 
     userRepo = new EFRepository<User, MyEntities>(Context); 
    } 
} 

からクラスがベースのビジネスクラスです

public class EFRepository<TEntity, TContext> : IRepository<TEntity, TContext>, IDisposable 
    where TEntity : class 
    where TContext : ObjectContext 
{ 

    protected TContext context; 

    public EFRepository(TContext context) 
    { 
     this.context = context; 
    } 

    //CRUD methods... 

    public void Dispose() 
    { 
     if (null != context) 
     { 
      context.Dispose(); 
     } 
    } 
} 

このデザインでは、ビジネスクラスのコンストラクタではなく、内部のリポジトリのインスタンスを作成しているのでusing句を使用すると、リポジトリのdisposeメソッドがデフォルトで呼び出されることはありません。私の主な質問は、コンテキスト/リポジトリが廃棄されていることを確認する方法です。

コンストラクタではなく、各メソッド内部のusing句でリポジトリを作成できますが、よりエレガントな方法があるのだろうかと思います。

一般的なデザインについてもお気軽にお問い合わせください。

+0

ルック(http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in -mvc/6990244#6990244) – Eranga

答えて

2

これは完全に間違っています。リポジトリの外部でコンテキストを作成しているため、リポジトリは処分の責任を負いません。処分のためにリポジトリが構築される層= BaseBLLは、使い捨てでなければならず、上位層は、それがもはや必要でないときにそれを正しく処分する必要があります。

+0

よろしくお願いします。それを渡すのではなく、リポジトリ内にコンテキストを作成しますか?適切に処分されていることをどのように確認しますか? using節の中のビジネス層にリポジトリのインスタンスを作成しますか? –

+0

私は完全に*間違っているとは言わず、ちょっと不潔です。リポジトリはコンテキストを作成するのに十分に知ることができますが、接続文字列などに結合されたコンテキストの作成と組み合わせることになります。代わりにUnityなどのIoCコンテナを使用してリポジトリのコンストラクタにコンテキストを注入します。コンテナを介してこれをすべて実行していて、設定の有効期間が適切であれば、処分について心配する必要はありません。 – Kit

関連する問題