我正在尝试为我的 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 guide在 Injecting dependencies into Web API filter attributes 中对此进行了详细介绍部分。它基本上描述的是您需要做两件事:
- 使用
RegisterWebApiFilterProvider
扩展方法允许简单注入(inject)器构建 Web API 属性。 - 注册自定义
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)。
关于dependency-injection - 简单注入(inject)器 webapi 授权属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26364103/