Подтвердить что ты не робот

Доступ к ядру ninject в Application_Start

Я использую Ninject и расширение MVC3, установленное с nuget. Мой код установки ядра находится в файле App_Start/NinjectMVC3.cs. Все отлично работает в контроллерах, но я не могу понять, как (правильно) связывать интерфейсы в коде Global.asax.cs MvcApplication.

Я закончил использование хака (создание общедоступного метода NinjectMVC3.GetKernel(), который возвращает bootstrap.kernel). Однако это будет устаревшим, и должен быть правильный способ сделать это, что я не вижу.

Вот мой код:

public class LogFilterAttribute : ActionFilterAttribute
{
    private IReportingService ReportingService { get; set; }
    public LogFilterAttribute( IReportingService reportingService )
    {
        this.ReportingService  = reportingService;
    }
    ...
}

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters( GlobalFilterCollection filters )
    {
        filters.Add( new HandleErrorAttribute() );
        filters.Add( new LogFilterAttribute()  );
    }
    ...
    protected void Application_Start()
    {
        ...
        RegisterGlobalFilters( GlobalFilters.Filters );
        // NOTE hack:
        var kernel = NinjectMVC3.GetKernel();
        var logger = kernel.Get<ILogger>();
        var bw = new BackgroundWork(logger);
        Application["BackgroundWork"] = bw;
        bw.Start();
    }
}

Есть два интерфейса, которые меня интересуют. Первый - это просто привязка объекта к глобальной переменной (ILogger для BackgroundWork).

А второй - ActionFilter. Я читал http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/, но я не вижу, как он подключается к фактической регистрации (filter.Add).

Я не хочу использовать Свойство Inject, если я могу его избежать.

Любые мысли о правильном способе сделать это? Спасибо

4b9b3361

Ответ 1

MVC 3 вводит DependencyResolver, который заполняется в одноэлементный номер, а расширение Ninject поддерживает его. Вы можете использовать это в своем классе MvcApplication, если вам это нужно:

protected void Application_Start()
{
    // ...
    var logger = DependencyResolver.Current.GetService<ILogger>();
}

Теперь я должен указать, что нет необходимости делать это с помощью фильтров действий. В Ninject.MVC3 вы должны использовать синтаксис BindFilter, например:

// Declare empty attribute
public class MyFilterAttribute : FilterAttribute { }

// Dependency module
public class MyModule : NinjectModule
{
    public override void Load()
    {
        // Other bindings
        // ...
        this.BindFilter<MyActionFilter>(FilterScope.Action, 1)
            .WhenControllerHas<MyFilterAttribute>();
    }
}

Обратите внимание, что вы должны использовать this, потому что BindFilter - это метод расширения, и вам также нужно ссылаться на пространство имен Ninject.Web.Mvc.FilterBindingSyntax.