团结依赖注入与全球网络API过滤器属性 [英] Unity Dependency Injection with Global Web API Filter Attribute

查看:354
本文介绍了团结依赖注入与全球网络API过滤器属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

引用此 codePLEX团结文章,我能得到筛选器属性具有的WebAPI控制器工作如下:

  [MyFilterAttribute]
公共类的TestController:ApiController
{}

不过,如果我想在所有的操作运用我的筛选器属性与它被剥去了依赖注入的GlobalConfiguration:

 公共类MyFilterAttribute:ActionFilterAttribute
{
    [依赖]
    公共MyDependency {搞定;组; }    公共覆盖无效OnActionExecuting(HttpActionContext ActionContext中)
    {
         如果(this.MyDependency == NULL)//总是空开全局配置
             抛出新的异常();
    }
 }公共静态类UnityWebApiActivator
    {
        公共静态无效的start()
        {
            VAR解析器=新UnityDependencyResolver(UnityConfig.GetConfiguredContainer());            GlobalConfiguration.Configuration.DependencyResolver =解析器;            GlobalConfiguration.Configuration.Filters.Add(新MyFilterAttribute());            RegisterFilterProviders();
        }        私有静态无效RegisterFilterProviders()
        {
            VAR提供商=
                GlobalConfiguration.Configuration.Services.GetFilterProviders()了ToList()。            GlobalConfiguration.Configuration.Services.Add(
                typeof运算(System.Web.Http.Filters.IFilterProvider)
                新UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));            变种defaultprovider = providers.First(p值=指p是ActionDescriptorFilterProvider);            GlobalConfiguration.Configuration.Services.Remove(
                typeof运算(System.Web.Http.Filters.IFilterProvider)
                defaultprovider);
        }
    }

有没有更好的地方加入全球配置?


解决方案

发生问题,因为您要添加newed MyFilterAttribute的过滤器集合(即: GlobalConfiguration.Configuration.Filters.Add(* *新MyFilterAttribute()**)),而不是通过统一解决的一个实例。因为统一不参与创建实例的,它没有触发用于注射的依赖性。这应该只是通过统一解决的实例是可寻址的。例如:

<$p$p><$c$c>GlobalConfiguration.Configuration.Filters.Add((MyFilterAttribute)resolver.GetService(typeof(MyFilterAttribute()));

Referencing this CodePlex unity article I was able to get filter attribute working with a WebAPI controller as follows:

[MyFilterAttribute]
public class TestController : ApiController
{}

However, if I want to apply my filter attribute across all actions with a GlobalConfiguration it gets stripped of the injected dependency:

public class MyFilterAttribute : ActionFilterAttribute 
{
    [Dependency]
    public MyDependency { get; set; }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
         if (this.MyDependency == null) //ALWAYS NULL ON GLOBAL CONFIGURATIONS
             throw new Exception();
    }
 }

public static class UnityWebApiActivator
    {
        public static void Start() 
        {
            var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());

            GlobalConfiguration.Configuration.DependencyResolver = resolver;

            GlobalConfiguration.Configuration.Filters.Add(new MyFilterAttribute());

            RegisterFilterProviders();
        }

        private static void RegisterFilterProviders()
        {
            var providers =
                GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();

            GlobalConfiguration.Configuration.Services.Add(
                typeof(System.Web.Http.Filters.IFilterProvider),
                new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));

            var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);

            GlobalConfiguration.Configuration.Services.Remove(
                typeof(System.Web.Http.Filters.IFilterProvider),
                defaultprovider);
        }
    }

Is there a better place to add the Global Configuration?

解决方案

The problem is occurring because you are adding a newed MyFilterAttribute to the filters collection (i.e.: GlobalConfiguration.Configuration.Filters.Add(**new MyFilterAttribute()**)) as opposed to an instance resolved through Unity. Since Unity does not participate in creation of the instance, it has no trigger for injecting the dependency. This should be addressable by simply resolving the instance through Unity. e.g.:

GlobalConfiguration.Configuration.Filters.Add((MyFilterAttribute)resolver.GetService(typeof(MyFilterAttribute()));

这篇关于团结依赖注入与全球网络API过滤器属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆