9

Sto usando Ninject nella mia applicazione MVC 3 e uno dei miei dipendenze è in Entity Framework:Ninject + ASP.net MVC + Entity Framework: quando viene disposto il mio contesto?

interface IFooRepository 
{ 
    Foo GetFoo(int id); 
} 

public EFFooRepository : IFooRepository 
{ 
    private FooDbContext context; 

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

ho creato un legame in questo modo in Ninject, quindi se ho più di una dipendenza e entrambi hanno bisogno un contesto di dati che finiscono per condividere lo stesso contesto:

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

Non sono sicuro di quando verrà disposto il mio contesto. Dal momento che non sono io quello che lo crea, verrà mai eliminato o verrà semplicemente eliminato quando viene raccolto dei rifiuti? Ninject sa di Smaltire qualsiasi cosa quando è finita?

risposta

11

Se i FooDbContext implementa IDisposable, Ninject chiamerà automaticamente il metodo Dispose su di esso alla fine della richiesta.

Ecco come è possibile verificare che:

  1. Creare una nuova applicazione ASP.NET MVC 3 utilizzando il modello predefinito
  2. Installare il pacchetto Ninject.Mvc3 NuGet
  3. avere le seguenti:

    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. Aggiungere quanto segue nel metodo di ~/App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. Eseguire l'applicazione. Come previsto al termine della richiesta, l'istanza FooDbContext viene eliminata e viene generata l'eccezione NotImplementedException.

+0

Questo è quello che speravo. Credo che DbContext implementa IDisposable. In effetti sarei scioccato se non fosse così. Grazie! – Dismissile

+2

@Dismissile, sì, DbContext implementa IDisposable. –

+0

Oh, molto carino. Grazie per l'esempio. – Dismissile

Problemi correlati