简单的注入器webapi授权属性

mht*_*sbt 2 dependency-injection simple-injector asp.net-web-api

我正在尝试为我的WebApi项目创建自定义授权属性.

在这个属性中,我想注入一个IAuthModule对象.我不知道如何实现这一点.我在网上找到了一些解决方案,但我没有成功.

这是我到目前为止:

public void Configuration(IAppBuilder app)
{
    // WebApi config
    HttpConfiguration config = new HttpConfiguration();

    // SimpleInjector
    var container = new SimpleInjector.Container();

    container.Register<IAuthModule, CoreAuthModule>();

    container.RegisterWebApiFilterProvider(config);
    container.RegisterWebApiControllers(config);

    container.Verify();

    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

    // Setup Oauth
    ConfigureOAuth(app, container.GetInstance<IAuthModule>());

    WebApiConfig.Register(config);

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

和属性:

public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    // how can I inject something here?
    public IAuthModule AuthModule { get; set; }

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 8

简单的喷油器的Web API集成指南进入有关此方面的详细信息,注入依赖转换为Web API过滤器属性部分.它基本上描述的是你需要做两件事:

  1. 使用RegisterWebApiFilterProvider扩展方法允许Simple Injector构建Web API属性.
  2. 注册自定义IPropertySelectionBehavior以确保Simple Injector将依赖项注入属性的属性.

所以这基本上归结为添加以下注册:

var container = new Container();

container.Options.PropertySelectionBehavior = new ImportPropertySelectionBehavior();

container.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)

ImportPropertySelectionBehavior被实施如下:

using System;
using System.ComponentModel.Composition;
using System.Linq;
using System.Reflection;
using SimpleInjector.Advanced;

class ImportPropertySelectionBehavior : IPropertySelectionBehavior {
    public bool SelectProperty(Type type, PropertyInfo prop) {
        return prop.GetCustomAttributes(typeof(ImportAttribute)).Any();
    }
}
Run Code Online (Sandbox Code Playgroud)

此自定义IPropertySelectionBehavior启用显式属性注入,其中属性使用System.ComponentModel.Composition.ImportAttribute属性标记.任何标有此属性的属性都将被注入.

请注意,属性中的依赖项注入是次优的,如此此处所述.