Доступ к недействительному ядру в Application_Start - PullRequest
16 голосов
/ 14 августа 2011

Я использую 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, если смогу его избежать.

Есть какие-нибудь мысли о правильном способе сделать это? Спасибо

1 Ответ

24 голосов
/ 15 августа 2011

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.

...