如何将 Ninject "Filter Attribute" -Binding 转换为 Autofac?



我有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 中,这是它们在启动时绑定的顺序)以及如何向下传递属性,但这感觉它的方向是正确的。

相关内容

最新更新