9

私はMVC 3アプリケーションでNinjectを使用していますし、私の依存関係の1つは、Entity Frameworkの上にある:Ninject + ASP.net MVC +エンティティフレームワーク - コンテキストはいつ削除されますか?

interface IFooRepository 
{ 
    Foo GetFoo(int id); 
} 

public EFFooRepository : IFooRepository 
{ 
    private FooDbContext context; 

    public EFFooRepository(FooDbContext context) 
    { 
     this.context = context; 
    } 
} 

私は複数の依存関係を持っており、彼らの両方が必要な場合ので、私は、Ninjectにそうようにバインディング設定データコンテキストは同じコンテキストを共有することになります。

Bind<FooDbContext>().ToSelf().InRequestScope(); 

私のコンテキストがいつ廃棄されるのかは不明です。私はそれをインスタンス化するものではないので、それは処分されるか、それともガベージコレクションのときに処分されるのだろうか? Ninjectは、それが完了したら何かを処分することを知っていますか?

答えて

11

FooDbContextIDisposableを実装している場合、Ninjectはリクエストの最後に自動的にDisposeメソッドを呼び出します。

は、ここであなたがそれを確認することができます方法は次のとおりです。

  1. デフォルトテンプレート
  2. を使用して、新しいASP.NET MVC 3アプリケーションを作成しますNinject.Mvc3 NuGetパッケージをインストールし
  3. 次の有無:

    public interface IFooRepository 
    { 
    } 
    
    public class FooDbContext: IDisposable 
    { 
        public void Dispose() 
        { 
         throw new NotImplementedException(); 
        } 
    } 
    
    public class EFFooRepository : IFooRepository 
    { 
        private FooDbContext _context; 
    
        public EFFooRepository(FooDbContext context) 
        { 
         _context = context; 
        } 
    } 
    
    public class HomeController : Controller 
    { 
        private readonly IFooRepository _repo; 
    
        public HomeController(IFooRepository repo) 
        { 
         _repo = repo; 
        } 
    
        public ActionResult Index() 
        { 
         return View(); 
        } 
    } 
    
  4. の方法で以下を追加します。~/App_Start/NinjectMVC3.cs

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. アプリケーションを実行します。要求の最後に期待されるように、FooDbContextインスタンスが廃棄され、NotImplementedException例外がスローされます。

+0

これは私が望んでいたものです。私はDbContextはIDisposableを実装すると信じています。実際にはそうでなければ私はショックを受けるだろう。ありがとう! – Dismissile

+2

@Dismissile、はい、DbContextはIDisposableを実装しています。 –

+0

ああ、とてもいいです。この例をありがとう。 – Dismissile

関連する問題