asp.net-mvc-3 ninject

asp.net mvc 3 - Accediendo al kernel ninject en Application_Start



asp.net-mvc-3 (1)

Estoy usando Ninject y la extensión MVC3 instalada con nuget. El código de configuración de mi kernel está en el archivo App_Start / NinjectMVC3.cs. Todo funciona muy bien en los controladores, pero no puedo averiguar cómo (correctamente) vincular interfaces en el código de aplicación global.asax.cs Mvc.

Terminé usando un hack (creando un método público NinjectMVC3.GetKernel () que devuelve bootstrap.kernel). Sin embargo, eso quedará en desuso, y debe haber una forma adecuada de hacerlo que no esté viendo.

Aquí está mi código:

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(); } }

Hay dos interfaces que me interesan. La primera es simplemente vincular un objeto a una variable global (el ILogger para BackgroundWork).

Y el segundo es para un ActionFilter. Leí http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ , pero no veo cómo se conecta al registro real (filtro .Añadir).

No quiero usar Property Inject si puedo evitarlo.

¿Alguna idea sobre la forma correcta de hacer esto? Gracias


MVC 3 presenta el DependencyResolver que se rellena en un singleton, y la extensión Ninject lo admite. Puede usar eso en su clase MvcApplication si lo necesita:

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

Ahora debo señalar que no es necesario hacer esto con los filtros de acción. En Ninject.MVC3 se supone que debes usar la sintaxis de BindFilter , así:

// 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>(); } }

Tenga en cuenta que tiene que usar this porque BindFilter es un método de extensión, y también tiene que hacer referencia al espacio de nombres Ninject.Web.Mvc.FilterBindingSyntax .