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