2016-10-26 70 views
0

我已將此鏈接用作參考;AuthorisationFilter中的統一DI WebApi

https://unity.codeplex.com/discussions/446780

所以按照我加了UnityActionFilterProvider類的鏈接;

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?關於我在這裏做錯的任何想法請在這裏?

回答

1

希望這將有助於某個人,某天。

基本上,這一切都歸功於我使用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); 
    }