有一種在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
這讓我很難!文檔(http://docs.autofac.org/en/latest/integration/mvc.html#enable-property-injection-for-action-filters)仍然提到屬性注入,我想那些需要更新。 – Ali