AuthorisationFilter WebApi 中的 Unity DI
Unity DI in AuthorisationFilter WebApi
这里我用了这个link作为参考;
https://unity.codeplex.com/discussions/446780
所以根据 link 我添加了一个 UnityActionFilterProvider class;
public class UnityActionFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
{
private readonly IUnityContainer container;
public UnityActionFilterProvider(IUnityContainer container)
{
this.container = container;
}
public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(configuration, actionDescriptor);
foreach (var filter in filters)
{
container.BuildUp(filter.Instance.GetType(), filter.Instance);
}
return filters;
}
}
然后我添加到我的 UnityConfig.cs
public static void RegisterFilterProviders(IUnityContainer UnityDependencyResolver)
{
var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
GlobalConfiguration.Configuration.Services.Add(
typeof(IFilterProvider),
new UnityActionFilterProvider(UnityDependencyResolver));
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
GlobalConfiguration.Configuration.Services.Remove(typeof(IFilterProvider), defaultprovider);
}
然后我在 Startup.cs
中调用
public void Configuration(IAppBuilder app)
{
HttpConfiguration = new HttpConfiguration();
LoggingConfig.RegisterLogger();
ConfigureOAuth(app);
var unityContainer = UnityConfig.GetConfiguredContainer();
HttpConfiguration.DependencyResolver = new UnityDependencyResolver(unityContainer);
//for DI in the filters
UnityConfig.RegisterFilterProviders(unityContainer);
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(HttpConfiguration);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(HttpConfiguration);
}
最后,我得到了以下过滤器(注意:我也尝试将其作为 ActionFilter 以查看是否有所不同)
public class HasPermissionAttribute : AuthorizationFilterAttribute
{
[Dependency]
public UserPermissionService UserService { get; set; }
public override void OnAuthorization(HttpActionContext actionContext)
{
}
}
但是,这个命中的时候UserService是null?请问我做错了什么?
希望有一天这会对某人有所帮助。
基本上这都是因为我使用了 OAuth 和 API。
因此,我只需要通过如下编辑 startup.cs 来确保配置通过过滤器传递;
HttpConfiguration = new HttpConfiguration();
LoggingConfig.RegisterLogger();
ConfigureOAuth(app);
var unityContainer = UnityConfig.GetConfiguredContainer();
HttpConfiguration.DependencyResolver = new UnityDependencyResolver(unityContainer);
//for DI in the filters
UnityConfig.RegisterFilterProviders(unityContainer, HttpConfiguration);
注册被修改为;
public static void RegisterFilterProviders(IUnityContainer UnityDependencyResolver, HttpConfiguration configuration)
{
var providers = configuration.Services.GetFilterProviders().ToList();
configuration.Services.Add(
typeof(IFilterProvider),
new UnityActionFilterProvider(UnityDependencyResolver));
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
configuration.Services.Remove(typeof(IFilterProvider), defaultprovider);
}
这里我用了这个link作为参考;
https://unity.codeplex.com/discussions/446780
所以根据 link 我添加了一个 UnityActionFilterProvider class;
public class UnityActionFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
{
private readonly IUnityContainer container;
public UnityActionFilterProvider(IUnityContainer container)
{
this.container = container;
}
public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(configuration, actionDescriptor);
foreach (var filter in filters)
{
container.BuildUp(filter.Instance.GetType(), filter.Instance);
}
return filters;
}
}
然后我添加到我的 UnityConfig.cs
public static void RegisterFilterProviders(IUnityContainer UnityDependencyResolver)
{
var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
GlobalConfiguration.Configuration.Services.Add(
typeof(IFilterProvider),
new UnityActionFilterProvider(UnityDependencyResolver));
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
GlobalConfiguration.Configuration.Services.Remove(typeof(IFilterProvider), defaultprovider);
}
然后我在 Startup.cs
中调用 public void Configuration(IAppBuilder app)
{
HttpConfiguration = new HttpConfiguration();
LoggingConfig.RegisterLogger();
ConfigureOAuth(app);
var unityContainer = UnityConfig.GetConfiguredContainer();
HttpConfiguration.DependencyResolver = new UnityDependencyResolver(unityContainer);
//for DI in the filters
UnityConfig.RegisterFilterProviders(unityContainer);
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(HttpConfiguration);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(HttpConfiguration);
}
最后,我得到了以下过滤器(注意:我也尝试将其作为 ActionFilter 以查看是否有所不同)
public class HasPermissionAttribute : AuthorizationFilterAttribute
{
[Dependency]
public UserPermissionService UserService { get; set; }
public override void OnAuthorization(HttpActionContext actionContext)
{
}
}
但是,这个命中的时候UserService是null?请问我做错了什么?
希望有一天这会对某人有所帮助。
基本上这都是因为我使用了 OAuth 和 API。
因此,我只需要通过如下编辑 startup.cs 来确保配置通过过滤器传递;
HttpConfiguration = new HttpConfiguration();
LoggingConfig.RegisterLogger();
ConfigureOAuth(app);
var unityContainer = UnityConfig.GetConfiguredContainer();
HttpConfiguration.DependencyResolver = new UnityDependencyResolver(unityContainer);
//for DI in the filters
UnityConfig.RegisterFilterProviders(unityContainer, HttpConfiguration);
注册被修改为;
public static void RegisterFilterProviders(IUnityContainer UnityDependencyResolver, HttpConfiguration configuration)
{
var providers = configuration.Services.GetFilterProviders().ToList();
configuration.Services.Add(
typeof(IFilterProvider),
new UnityActionFilterProvider(UnityDependencyResolver));
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
configuration.Services.Remove(typeof(IFilterProvider), defaultprovider);
}