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);
    }