有没有办法通过属性而不是注入使用AutoFac Web Api授权过滤器?

Mic*_*dis 6 authorization dependency-injection filter autofac asp.net-web-api

我有一个Autofac Web Api授权过滤器:

public class MyAuthorizationFilter : IAutofacAuthorizationFilter
{
    public void OnAuthorization(HttpActionContext actionContext){}
}

public class MyAuthorizationAttribute : Attribute
{
    public MyAuthorizationAttribute() { }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用Autofac Web Api授权过滤器的唯一方法是在AutofacConfig.cs中注入它:

builder.RegisterType<MyAuthorizationFilter>()
.AsWebApiAuthorizationFilterFor<MyController>(
    c => c.MyMethod(default(MyModel))
).InstancePerDependency();
Run Code Online (Sandbox Code Playgroud)

如果我不像上面那样注入它,它似乎被忽略了

public MyController : ApiController {

    [MyAuthroziationFilter] // ignored
    [POST("")]
    public HttpResponseMessage MyMethod(MyModel myModel) { 
        [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用AutoFac Web Api授权过滤器的属性/注释而不是通过AutoFac进行注入,并且还正确地注入了它们的依赖项?

Tra*_*lig 7

不幸的是,如果您想在过滤器中使用DI,则无法使用属性.根据文档:

与MVC中的过滤器提供程序不同,Web API中的过滤器提供程序不允许您指定不应高速缓存过滤器实例.这意味着Web API中的所有过滤器属性都是在应用程序的整个生命周期中存在的有效单例实例.

如果要使用属性,则可以使用标准Web API属性中的服务位置.从请求消息中获取请求生存期范围并手动解析所需的服务.

  • 请注意它是针对MVC的.正如我所提到的,Web API中没有类似的选项.相信我,我们在ASP.NET 5的上下文中与ASP.NET人员进行了长时间的谈话,试图告诉他们停止过度缓存的事情. (2认同)