Удаление связанного объекта в Ninject - PullRequest
1 голос
/ 25 июля 2011

Я связываю объект класса DonorContext (который происходит от DbContext из EntityFramework), как показано ниже в Global.ascx, как показано ниже.

kernel.Bind<DonorContext>().ToSelf().InRequestScope().OnDeactivation(DisposeDonorContext);

Я ожидал, что в конце запроса Ninject вызовет метод DisposeDonorContext. Но это никогда не вызывается.

То, что я мог получить из Интернета, было то, что объекты типов IDisposible будут автоматически вызывать свой метод Dispose при выходе из области видимости. Этого не происходит в моем случае, и, следовательно, я пытался OnDeactivation () избавиться от DonorContext (что также не происходит).

Есть идеи, почему избавления не происходит?

1 Ответ

2 голосов
/ 25 июля 2011

Ninject автоматически вызовет метод Dispose для объектов, реализующих IDisposable (по крайней мере, так было, когда я тестировал его с последней версией).Если это не произойдет для вас, я подозреваю, что проблема в том, что вы никогда не используете этот DonorContext в своем приложении.Таким образом, он никогда не создается и никогда не избавляется.Например, если у вас есть контроллер, который принимает этот контекст в качестве аргумента конструктора:

public class HomeController: Controller
{
    private readonly DonorContext _context;
    public HomeController(DonorContext context)
    {
        _context = context;
    }

    public ActionResult Index()
    {
        return View();
    }
}

Это должно работать.Это также будет работать, если у вас есть сервисный уровень, который принимает этот контекст в качестве аргумента конструктора, а затем вы используете этот сервис в контроллере (с внедрением конструктора).В конце дня у вас должен быть контроллер, который принимает некоторую зависимость, которая сама может быть DonorContext или какой-то другой зависимостью, которая сама зависит от DonorContext (хранилище, служба, ...) для запуска цепочки внедрения зависимости.

Имеется в виду, что работа с конкретным типом, таким как DonorContext в вашем контроллере, в некоторой степени побеждает цель использования Dependency Injection, поскольку вы жестко его кодируете.

...