9

estoy usando Ninject en mi aplicación MVC 3 y uno de mis dependencias es el marco de la entidad:Ninject + ASP.net MVC + Entity Framework: ¿cuándo se elimina mi contexto?

interface IFooRepository 
{ 
    Foo GetFoo(int id); 
} 

public EFFooRepository : IFooRepository 
{ 
    private FooDbContext context; 

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

puedo tener un vinculante como tal en Ninject, por lo que si tengo más de una dependencia y que ambos necesitan un contexto de datos que terminan compartiendo el mismo contexto:

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

No estoy seguro de cuándo se eliminará mi contexto. Como yo no soy el que lo ejemplifica, ¿alguna vez se eliminará o se eliminará cuando se recoja la basura? ¿Sabe Ninject desechar algo cuando haya terminado?

Respuesta

11

Si el FooDbContext implementa IDisposable, Ninject llamará automáticamente al método Dispose al final de la solicitud.

Así es como se puede comprobar que:

  1. Crear una nueva aplicación ASP.NET MVC 3 utilizando la plantilla predeterminada
  2. Instalar el paquete Ninject.Mvc3 NuGet
  3. tener lo siguiente:

    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. Agregue lo siguiente en el método RegisterServices de ~/App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. Ejecuta la aplicación. Como se esperaba al final de la solicitud, la instancia FooDbContext se elimina y se lanza la excepción NotImplementedException.

+0

Eso es lo que estaba esperando. Creo que DbContext implementa IDisposable. De hecho, me sorprendería si no lo hiciera. ¡Gracias! – Dismissile

+2

@Dismissile, sí, DbContext implementa IDisposable. –

+0

Oh muy agradable. Gracias por el ejemplo. – Dismissile

Cuestiones relacionadas