dependency-injection - 简单注入(inject)器 webapi 授权属性

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

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

在此属性中,我想注入(inject)一个 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;
    }
}

最佳答案

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

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

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

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 启用显式属性注入(inject),其中属性用 System.ComponentModel.Composition.ImportAttribute 属性标记。任何标有此属性的属性都将被注入(inject)。

请注意,属性中的依赖注入(inject)不是最优的,如所述herehere .

关于dependency-injection - 简单注入(inject)器 webapi 授权属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26364103/

相关文章:

vb.net - 使用Code-First进行Update-Database时出错:“数据库中已经存在一个名为'something'的对象。”

c# - 运行所有测试时测试失败,但一个一个运行成功

c# - 简单的注入(inject)器如何针对同一接口(interface)注册/解析单例集合

c# - 单元测试中的依赖注入(inject)

android - Dagger 2 混合瞄准镜

c# - 分块到 ASP.Net Web API 的多个异步文件上传

c# - Web API引发验证错误

c# - 在 Simple Injector 中注册具有原始配置依赖项的装饰器

java - 从子上下文引用在父上下文中创建的 Spring Singletons

WCF 和 Unity - 依赖注入(inject)