2011-07-25 6 views
1

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

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

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

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

Любые идеи о том, почему распоряжения не происходит?

ответ

2

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 в вашем контроллере, который поражает цель использования инъекции зависимостей по мере их жесткого кодирования.

+0

Дарин, На самом деле я вставляю объект Service Layer UserManager в свой контроллер. Этот объект UserManager содержит зависимость от DonorContext. Я использую атрибут [Inject] для ввода зависимостей. UserManager имеет область видимости по умолчанию ninject. Я уверен, что объект DonorContext создается и вводится на моем уровне обслуживания, поскольку я использую его для загрузки данных, которые происходят правильно. – Jatin

+0

Дарин, я только что установил пакет Ninject.MVC3, и теперь я вижу метод OnDeactivation(), вызывающий мой метод. Спасибо за вашу помощь. – Jatin

+3

+1 и все верно и правильно, но просто хотел сделать это явным, что это интеграция System.Web в Ninject, воплощенная в Ninject.MVC3, которая подключает это к тому, чтобы это было так - захват всей обработки в Ninject является GC-триггером Механизм кэширования и сбора данных, который в зависимости от вашего контекста хоста может вызвать наблюдаемые проблемы OP. Деактивация не происходит непосредственно в соответствующем месте цикла обработки ASP.NET –

Смежные вопросы