0

Я использовал эту ссылку здесь как ссылку;Unity DI в AuthorisationFilter 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); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^