2012-01-25 1 views
3

Я довольно новичок в 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, но я не вижу, где это вписывается в то, что я пытаюсь сделать.

Если у кого есть какие-либо намеки, которые помогут мне исправить мой маленький беспорядок, я был бы очень признателен!

ответ

2

Чтобы справиться с первым не использовать NinjectWebsiteApplication_BeginRequest событие, но написать собственный глобальный фильтр действий:

public class LogActionFilterAttribute : ActionFilterAttribute 
{ 
    private readonly ILogger _logger; 
    public LogActionFilterAttribute(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _logger.Debug("**********REQUEST BEGIN****************"); 
     _logger.Debug("**** URL = " + filterContext.HttpContext.Request.Url.AbsolutePath); 
    } 
} 

, а затем в вашем App_Start/NinjectMVC3.cs:

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ILogger>().To<Logger>(); 
    kernel.BindFilter<LogActionFilterAttribute>(FilterScope.Global, 1); 
} 

Не забудьте добавить using Ninject.Web.Mvc.FilterBindingSyntax;, чтобы принести метод расширения BindFilter<> в объем.

И поскольку у вас есть доступ к ядру внутри RegisterServices метода, который происходит при запуске приложения вы можете телеграфировать все остальное, включая ваш загрузчик, ...

Насколько ваш Global.asax обеспокоен больше не использовать какой-либо Ninject специфические вещи в нем. Вы не должны извлекать из NinjectApplication.

Инфраструктура WebActivator позволяет вам иметь отдельный метод инициализации.

+0

Спасибо за подробное объяснение! Я понимаю, как работает фильтр действий журнала для начинающих запросов, но как насчет запросов на конец? Например, у меня есть следующее (также у меня есть IUnitOfWork): void NinjectWebsiteApplication_EndRequest (отправитель объекта, System.EventArgs e) { ILogger logger = Kernel.Получить (); IUnitOfWork uow = Kernel.Get (); uow.Displose(); logger.Debug ("************ ЗАПРОСИТЬ КОНЕЦ ************"); } – hiro77

+0

@JoelHulen, вы просто переопределяете метод «OnActionExecuted» или «OnResultExecuted» в настраиваемом фильтре действий так же, как я показал метод «OnActionExecuting» в зависимости от того, где вы хотите распорядиться своей единицей работы: либо после действие завершило выполнение или представление закончило рендеринг. Также, если вы собираетесь распоряжаться своим UoF, вы, вероятно, не должны вызывать атрибут 'LogActionFilterAttribute'. Вы могли бы создать еще один способ для удаления. –

+0

Он отлично работает. Благодаря! По вашему мнению, что касается утилизации UoW, есть ли предпочтение распоряжаться OnActionExecuted над OnResultExecuted? Кроме того, знаете ли вы способ действия контроллера для «отказа» от атрибута глобального фильтра? – hiro77

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