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

如何获得Global.asax中调用静态方法所需的GlobalFilterCollection过滤器参数?我是否忽略了什么?没关系,我在应用程序启动方法中看到了FilterConfig.RegisterGlobalFilters。如果需要将依赖项的作用域限定到每个请求,则此操作无效。@Ishell如果要控制作用域,你必须遵循这个post@Wardy具体类型,使用一个包含需要解决的接口的构造函数…这让我很难受!文档()仍然提到了属性注入,我想这些需要更新。
builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
    .AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
    .InstancePerRequest();