Я использую 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, если смогу его избежать.
Есть какие-нибудь мысли о правильном способе сделать это?
Спасибо