Я довольно новичок в Ninject и DI в целом. Я использую NHibernate в качестве своего ORM для своего приложения MVC и очень доволен результатами. То есть, пока я не обновился с Ninject 2.1 до 2.2.Как НЕ использовать ядро Ninject в качестве локатора ресурсов
Теперь я получаю ошибки в классе NinjectWebsiteApplication из-за использования ядра Ninject в качестве локатора ресурсов.
Пример:
void NinjectWebsiteApplication_BeginRequest(object sender, System.EventArgs e)
{
ILogger logger = Kernel.Get<ILogger>();
logger.Debug(“**********REQUEST BEGIN****************”);
logger.Debug(“**** URL = ” + Request.Url.AbsolutePath);
}
Пример 2:
protected override void OnApplicationStarted()
{
var bootstrapper = Kernel.Get<Bootstrapper>();
bootstrapper.RegisterAllAreas();
AreaRegistration.RegisterAllAreas();
......
(More stuff here, like AutoMapper mappings, etc.)
......
}
* The Bootstrapper
класс это класс я создал, где я зарегистрировать свои маршруты, глобальные фильтры и т.д.
В обоих в приведенных выше примерах я получаю предупреждение о функциях Kernel.Get()
, в которых говорится следующее:
«Ninject.Web.Mvc.NinjectHttpApplication.Kernel» является устаревшим: «Не используйте Ninject в Service Locator»
После проведения нескольких поисков на этом, по общему мнению, что это правда.
Я пытаюсь обойти это, но я немного потерял, что делать.
Я загрузил новейший пакет Ninject.Web.Mvc NuGet, который создает статический класс NinjectMVC3 в папке App_Start. Я вижу, что они ссылаются на Microsoft.Web.Infrastructure.DynamicModuleHelper
, но я не вижу, где это вписывается в то, что я пытаюсь сделать.
Если у кого есть какие-либо намеки, которые помогут мне исправить мой маленький беспорядок, я был бы очень признателен!
Спасибо за подробное объяснение! Я понимаю, как работает фильтр действий журнала для начинающих запросов, но как насчет запросов на конец? Например, у меня есть следующее (также у меня есть IUnitOfWork): void NinjectWebsiteApplication_EndRequest (отправитель объекта, System.EventArgs e) { ILogger logger = Kernel.Получить(); IUnitOfWork uow = Kernel.Get (); uow.Displose(); logger.Debug ("************ ЗАПРОСИТЬ КОНЕЦ ************"); } –
hiro77
@JoelHulen, вы просто переопределяете метод «OnActionExecuted» или «OnResultExecuted» в настраиваемом фильтре действий так же, как я показал метод «OnActionExecuting» в зависимости от того, где вы хотите распорядиться своей единицей работы: либо после действие завершило выполнение или представление закончило рендеринг. Также, если вы собираетесь распоряжаться своим UoF, вы, вероятно, не должны вызывать атрибут 'LogActionFilterAttribute'. Вы могли бы создать еще один способ для удаления. –
Он отлично работает. Благодаря! По вашему мнению, что касается утилизации UoW, есть ли предпочтение распоряжаться OnActionExecuted над OnResultExecuted? Кроме того, знаете ли вы способ действия контроллера для «отказа» от атрибута глобального фильтра? – hiro77