Asp.net mvc 4 在ASP.NETMVC4和Autofac中注册全局筛选器
我有一个这样的过滤器:Asp.net mvc 4 在ASP.NETMVC4和Autofac中注册全局筛选器,asp.net-mvc-4,autofac,action-filter,asp.net-mvc-filters,Asp.net Mvc 4,Autofac,Action Filter,Asp.net Mvc Filters,我有一个这样的过滤器: public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter { public MyPropery Property { get; set; } .... } 我需要为我的项目中的每个操作运行它 我试图在GlobalFilter中注册它,但我的属性没有被注入 我试图注册我的过滤器,但没有被调用 你知道怎么做吗?你现在应该使用Pete的解决方案来做这件事。感
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public MyPropery Property { get; set; }
....
}
我需要为我的项目中的每个操作运行它
我试图在GlobalFilter中注册它,但我的属性没有被注入
我试图注册我的过滤器,但没有被调用
你知道怎么做吗?你现在应该使用Pete的解决方案来做这件事。感谢他提供了最新的解决方案 我终于做到了,下面是如何做到的: 首先使用具有所有依赖项的构造函数创建属性
public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
private IProperty _property;
public CustomFilterAttribute(IProperty repository)
{
_property = property;
}
....
}
在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));
var builder=newcontainerbuilder();
RegisterController(Assembly.getExecutionGassembly());
builder.RegisterType().As();
builder.RegisterType().SingleInstance();
builder.RegisterFilterProvider();
IContainer容器=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
这样注册你的全局过滤器
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService<CustomFilterAttribute>());
}
publicstaticvoidregisterglobalfilters(GlobalFilterCollection过滤器)
{
filters.Add(新HandleErrorAttribute());
filters.Add(DependencyResolver.Current.GetService());
}
确保在global.asax中首先注册Autofac,然后注册全局过滤器
现在,您不再需要属性注入,构造函数注入将很好地工作,这是一件好事 有一种在AutoFac中注册MVC全局过滤器的新方法。首先,从您的
注册表全局过滤器
中删除过滤器注册,因为我们将使用Autofac句柄将它们添加到控制器/操作中,而不是MVC中
然后,按如下方式注册您的容器:
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));
如果您的操作采用了参数,请使用default
关键字指定:
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
.InstancePerRequest();
builder.Register(c=>newCustomFilterAttribute(c.Resolve()))
.AsActionFilterFor(c=>c.Detail(默认值(int)))
.InstancePerRequest();
请注意,您必须根据要注册的筛选器类型使用不同的扩展方法,以下是支持的筛选器类型:
- 动作过滤器
- AsAuthorizationFilterFor
- AsExceptionFilterFor
- AsResultFilterFor
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
.AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
.InstancePerRequest();