gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:26:59 26 4
gpt4 key购买 nike

我有 MVC 和 WebAPI 过滤器属性,其参数应该会增加一些操作过滤器。我们现在正在切换到 autofac,我需要转换 DI 定义。

在 Ninject 中我有这样的东西:

Kernel.BindFilter<ShopAuthorizationMVCFilter>(System.Web.Mvc.FilterScope.Controller, 0)
.WhenControllerHas<ShopAuthorizationMVC>()
.InRequestScope()
.WithConstructorArgumentFromControllerAttribute<ShopAuthorizationMVC>("rechte", o => o.Rechte);

我可以像这样装饰 Actions 和 Controller :

[ShopAuthorizationMVC(RightsEnum.CanAccessMycontroller)]
public class MyController : Controller {}

这在 Ninject 上运行良好,但我完全不知道如何在 Autotofac 中编写它。

到目前为止我得到的是:

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

但我不知道如何 a) 使用我的过滤器属性仅在 Controller (和\或操作)上应用该规则,以及 b) 移交参数。

最佳答案

我想我已经破解了这个。最初我尝试了“WhenControllerHas”路线,但发现这适用于所有 Controller 操作......不是我想要的。

我原来的属性是这样的:

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

关于ninject - 如何将 Ninject "Filter\Attribute"-Binding 转换为 Autofac?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com