Asp.net-Mvc-4

在 ASP.Net MVC 4 和 Autofac 中註冊全域過濾器

  • November 12, 2012

我有一個像這樣的過濾器:

public class CustomFilterAttribute : ActionFilterAttribute, IAuthorizationFilter
{
   public MyPropery Property { get; set; }
   ....
}

我需要為我的項目中的每個操作執行它

我試圖在 GlobalFilters 中註冊它,但我的屬性沒有被注入

我試過這個解決方案來註冊我的過濾器,但它沒有被呼叫

關於如何做到這一點的任何想法?

有一種在 AutoFac 中註冊 MVC 全域過濾器的新方法。首先,從您的過濾器註冊中刪除RegisterGlobalFilters,因為我們將使用 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));

請注意,通過將Controller類傳遞到擴展AsActionFilterFor()中,我們告訴 AutoFac 將此過濾器應用於從該類派生的所有Controller類(在 MVC 中,所有類都是控制器)。由於我們在AsActionFilterFor()沒有任何參數的情況下呼叫,我們還指定我們希望將過濾器應用於指定控制器中的所有操作。如果要將過濾器應用於選擇控制器和操作,可以使用 lambda 表達式,如下所示:

builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
   .AsActionFilterFor<HomeController>(c => c.Index())
   .InstancePerHttpRequest();

如果您的操作帶有參數,請使用default關鍵字指定:

builder.Register(c => new CustomFilterAttribute(c.Resolve<IProperty>()))
   .AsActionFilterFor<HomeController>(c => c.Detail(default(int)))
   .InstancePerRequest();

請注意,您必鬚根據您註冊的過濾器類型使用不同的擴展方法,以下是支持的過濾器類型:

  • AsActionFilterFor
  • AsAuthorizationFilterFor
  • AsExceptionFilterFor
  • AsResultFilterFor

引用自:https://stackoverflow.com/questions/13346801