Ninject + ASP.net MVC + Entity Framework - когда мой контекст удаляется? - PullRequest
9 голосов
/ 17 сентября 2011

Я использую Ninject в своем приложении MVC 3, и одна из моих зависимостей связана с Entity Framework:

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, что нужно утилизировать что-либо, когда это сделано?

1 Ответ

11 голосов
/ 17 сентября 2011

Если FooDbContext реализует IDisposable, Ninject автоматически вызовет метод Dispose для него в конце запроса.

Воткак это проверить:

  1. Создайте новое приложение ASP.NET MVC 3, используя шаблон по умолчанию
  2. Установите пакет 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. Добавьте следующее в RegisterServices метод ~/App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope();
        kernel.Bind<IFooRepository>().To<EFFooRepository>();
    }
    
  5. Запуститеприложение.Как и ожидалось в конце запроса, экземпляр FooDbContext удаляется и выдается исключение NotImplementedException.

...