tipos - patron de inyeccion de dependencias c#
Ninject y MVC3: inyección de dependencia para filtros de acción (2)
Aquí es cómo podría proceder:
public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
{
private class MyModule : NinjectModule
{
public override void Load()
{
Bind<IService>().To<ServiceImpl>();
Bind<IAuthenticationHelper>().To<AuthenticationHelperImpl>();
}
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
protected override IKernel CreateKernel()
{
var modules = new INinjectModule[] {
new MyModule()
};
var kernel = new StandardKernel(modules);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
return kernel;
}
}
y luego podría tener su atributo de autorización personalizado:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
[Inject]
public IService Service { get; set; }
[Inject]
public IAuthenticationHelper AuthenticationHelper { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
}
}
y un controlador de acción decorado con él:
[CustomAuthorize]
public ActionResult Index()
{
return View();
}
y las dependencias deben ser inyectadas.
He encontrado un montón de artículos no concluyentes y preguntas sobre cómo realizar la inyección de propiedades en un ActionFilter en ASP.NET MVC3 usando Ninject.
¿Podría alguien darme un ejemplo claro por favor?
Aquí está mi atributo de autenticación personalizado.
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
[Inject]
public IService Service { get; set; }
[Inject]
public IAuthenticationHelper AuthenticationHelper { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
//My custom code
}
}
Estoy usando el activador web para configurar Ninject
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProject.Web.AppStart_NinjectMvc3), "Start")]
namespace MyProject.Web {
public static class AppStart_NinjectMvc3 {
public static void RegisterServices(IKernel kernel) {
//Binding things
}
public static void Start() {
// Create Ninject DI Kernel
IKernel kernel = new StandardKernel();
// Register services with our Ninject DI Container
RegisterServices(kernel);
// Tell ASP.NET MVC 3 to use our Ninject DI Container
DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
}
}
}
Mi servicio y ayudante nunca son inyectados. ¿Qué necesito cambiar?
En mi opinión, hay una solución mejor que usar atributos de filtro. Vea mi blogposts sobre una forma alternativa de declarar filtros usando Ninject. No requiere inyección de propiedades y en su lugar usa inyección de constructor:
http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ http://www.planetgeek.ch/2011/02/22/ninject-mvc3-and-ninject-web-mvc3-merged-to-one-package/