我有MVC和WebAPI filterattributes参数应该会增加一些actionfilters。我们现在正在切换到autofac,我需要转换DI-Definition。
在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)仅使用我的filterattribute将控制器(和\或Actions)应用于该规则,并且b)移交参数。
答案 0 :(得分:1)
我原来的属性看起来像这样:
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/");
}
}
并将其添加到autofac设置中:
builder.RegisterFilterProvider();
builder.RegisterType<MyAttribute>().PropertiesAutowired();
到目前为止一切都那么好!代码现在只在使用属性装饰的动作结果上运行
[MyAttribute]
public ActionResult Index() {}
我还有一些要弄清楚的事情,即属性应用的顺序(在ninject中,它是在启动时绑定的顺序)以及如何传递属性但是这感觉就像它在正确的方向。