我有MVC和WebAPI过滤器属性,其参数应该会增加一些动作过滤器。我们现在切换到 autofac,我需要转换 DI 定义。
在Ninject中,我有这样的东西:
Kernel.BindFilter<ShopAuthorizationMVCFilter>(System.Web.Mvc.FilterScope.Controller, 0)
.WhenControllerHas<ShopAuthorizationMVC>()
.InRequestScope()
.WithConstructorArgumentFromControllerAttribute<ShopAuthorizationMVC>("rechte", o => o.Rechte);
我可以像这样装饰动作和控制器:
[ShopAuthorizationMVC(RightsEnum.CanAccessMycontroller)]
public class MyController : Controller {}
这适用于Ninject,但我完全不知道如何在Auotofac中编写它。
到目前为止,我得到的是:
builder.Register(c =>
new ShopAuthorizationMVCFilter(c.Resolve<IAuthClass>(), default(RightsEnum[])))
.AsActionFilterFor<Controller>()
.InstancePerRequest();
但是我不知道如何 a) 仅将该规则应用于具有我的过滤器属性的控制器(和/或操作)和 b) 移交参数。
我已经破解了这个。 最初我尝试了"WhenControllerHas"路由,但发现这适用于所有控制器操作......不是我想要的。
我的原始属性如下所示:
public class MyAttribute : Attribute { }
public class MyFilter : ActionFilterAttribute
{
private readonly MyService _myService;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (_myService.IsSomething())
{
return;
}
filterContext.Result = new RedirectResult("/my-url/");
}
}
并在 ninject 中连接为:
kernel.BindFilter<MyFilter>(FilterScope.Action, 0).WhenActionMethodHas<MyAttribute>();
经过一些实验,我将属性更改为:
public class MyAttribute : ActionFilterAttribute
{
public MyService MyService { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (MyService.IsSomething())
{
return;
}
filterContext.Result = new RedirectResult("/my-url/");
}
}
并将其添加到自动FAC设置中:
builder.RegisterFilterProvider();
builder.RegisterType<MyAttribute>().PropertiesAutowired();
到目前为止一切顺利! 代码现在仅在使用以下属性修饰的操作结果上运行:
[MyAttribute]
public ActionResult Index() {}
我仍然需要弄清楚一些事情,即属性的应用顺序(在 Ninject 中,这是它们在启动时绑定的顺序)以及如何向下传递属性,但这感觉它的方向是正确的。