【问题标题】:How to convert Ninject "Filter \ Attribute"-Binding to Autofac?如何将 Ninject “Filter \ Attribute”-Binding 转换为 Autofac?
【发布时间】:2023-03-08 14:06:02
【问题描述】:

我有 MVC 和 WebAPI 过滤器属性,其参数应该提升一些操作过滤器。我们现在正在切换到 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,但我完全不知道如何在 Autofac 中编写它。

到目前为止我得到的是:

builder.Register(c => 
    new ShopAuthorizationMVCFilter(c.Resolve<IAuthClass>(), default(RightsEnum[])))
    .AsActionFilterFor<Controller>()
    .InstancePerRequest();

但我不知道如何 a) 仅使用我的 filterattribute 将该规则应用于控制器(和\或操作),并且 b) 移交参数。

【问题讨论】:

  • 嘿,你有没有找到解决这个问题的方法?!我目前正在从事的项目中遇到完全相同的问题并尽可能搜索,我只是找不到解决方案......
  • 很遗憾没有,抱歉

标签: ninject autofac actionfilterattribute


【解决方案1】:

我想我已经破解了这个。最初我尝试了“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/");
    }
}

并将其添加到 autofac 设置中:

builder.RegisterFilterProvider();
builder.RegisterType<MyAttribute>().PropertiesAutowired();

到目前为止一切顺利!代码现在只在用属性修饰的操作结果上运行:

[MyAttribute]
public ActionResult Index() {}

我还有一些事情要弄清楚,即应用属性的顺序(在 ninject 中,这是它们在启动时绑定的顺序)以及如何向下传递属性,但这感觉就像在正确的方向。

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多