Будет ли Ninject Call распоряжаться и закрывать Nibernate Isession? - PullRequest
9 голосов
/ 09 марта 2011

Я использую ASP.NET MVC 3 с Ninject и NHibernate.

Когда я думаю о DI, я думаю, что тот, кто получает ресурс, также обязательно закрывает его (В этом случае ответственность должен нести Ninject)

Но я не уверен, как работает Ninject при использовании InRequestScope.

Мой код:

Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();

Я открываю сеанс и помещаю его в I InRequestScope,но будет ли Ninject закрывать мою ISession, когда она выходит за рамки запроса?

1 Ответ

7 голосов
/ 09 марта 2011

Если я правильно понимаю код, ответ - да.Одна из ActivationStrategies, используемая Ninject, - это DisposableStrategy, чей метод Deactivate вызывает Dispose для всего, что реализует IDisposable.Если вы используете расширения Ninject.Web.MVC, модуль OnePerRequestModule автоматически очистит кеш привязки.Это вызовет метод Deactivate для всех ActivationStrategies, включая DisposableStrategy.

Поскольку ISession реализует IDisposable, он будет удален.Реализация по умолчанию ISession, SessionImpl, закрывает Session on Dispose.

Если вы не используете расширения Ninject.Web.MVC, кэш в конечном итоге будет очищен, но может произойти не прямо в EndRequest.*

...