【问题标题】:Simple injector webapi authorization attribute简单的注入器 webapi 授权属性
【发布时间】:2014-10-21 03:43:01
【问题描述】:

我正在尝试为我的 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);
}

和属性:

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

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        return false;
    }
}

【问题讨论】:

    标签: dependency-injection asp.net-web-api simple-injector


    【解决方案1】:

    Simple Injector Web API integration guideInjecting dependencies into Web API filter attributes 部分中对此进行了详细介绍。它基本上描述的是你需要做两件事:

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

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

    var container = new Container();
    
    container.Options.PropertySelectionBehavior = new ImportPropertySelectionBehavior();
    
    container.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
    

    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();
        }
    }
    

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

    请注意,属性中的依赖注入是次优的,如 herehere 所述。

    【讨论】:

    • 新版Simple Injector没有RegisterWebApiFilterProvider方法。
    • @Steven 在 SimpleInjector 4 中有没有 RegisterWebApiFilterProvider 的替代品? 编辑 @Chandermani 发现这个:simpleinjector.readthedocs.io/en/latest/… 基本上只使用服务定位器(反)模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多