example - Registre filtros globales en ASP.Net MVC 4 y Autofac
autofac web api 2 owin example (2)
Tengo un filtro como este:
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public MyPropery Property { get; set; }
....
}
Necesito que se ejecute para cada acción en mi proyecto
Intenté registrarlo en GlobalFilters, pero mi propiedad no se inyectó
Intenté Esta solución para registrar mi filtro pero no se llama
¿Alguna idea sobre cómo hacer eso?
Ahora debería usar la solución de Pete ahora para hacer esto. Gracias a él por una solución actualizada.
Finalmente lo logré, así es cómo hacerlo:
Primero crea tu atributo con un constructor con todas las dependencias
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
private IProperty _property;
public CustomFilterAttribute(IProperty repository)
{
_property = property;
}
....
}
Registre todo lo que necesita en autofac
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<MyProperty>().As<IProperty>();
builder.RegisterType<CustomFilterAttribute>().SingleInstance();
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Registra tu filtro global así
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomFilterAttribute>());
}
Asegúrese de que en su archivo global.asax primero registre Autofac y luego los filtros globales.
Ahora, ya no necesita inyecciones de propiedad, la inyección del constructor funcionará bien, ¡lo que es bueno!
Hay una nueva forma de registrar los filtros globales de MVC en AutoFac. Primero, elimine el registro del filtro de RegisterGlobalFilters
porque tendremos el asa Autofac agregándolos a nuestros controladores / acciones en lugar de MVC.
Luego, registre su contenedor de la siguiente manera:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<MyProperty>().As<IProperty>();
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<Controller>().InstancePerHttpRequest();
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Tenga en cuenta que al pasar la clase Controller
a la extensión AsActionFilterFor()
le estamos diciendo a AutoFac que aplique este filtro a todas las clases que se derivan de la clase Controller
(que, en MVC, son todos los controladores). Como estamos llamando a AsActionFilterFor()
sin ningún argumento, también estamos especificando que queremos que el filtro se aplique a todas las acciones dentro de los controladores especificados. Si desea aplicar su filtro a un controlador y una acción de selección, puede usar expresiones lambda como las siguientes:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Index())
.InstancePerHttpRequest();
Si su acción toma un parámetro, use la palabra clave default
para especificar:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
.InstancePerRequest();
Tenga en cuenta que debe usar un método de extensión diferente en función del tipo de filtro que está registrando, aquí están los tipos de filtro admitidos:
- AsActionFilterFor
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor