如何将Ninject“Filter \ Attribute”-Binding转换为Autofac?

时间:2016-02-08 19:55:49

标签: ninject autofac actionfilterattribute

我有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)移交参数。

1 个答案:

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