【问题标题】:Unity Dependency Injection with Global Web API Filter Attribute具有全局 Web API 过滤器属性的 Unity 依赖注入
【发布时间】:2014-04-08 02:39:01
【问题描述】:

引用这个CodePlex unity article 我能够获得过滤器属性与 WebAPI 控制器一起使用,如下所示:

[MyFilterAttribute]
public class TestController : ApiController
{}

但是,如果我想通过 GlobalConfiguration 将我的过滤器属性应用于所有操作,它将被剥离注入的依赖项:

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

有没有更好的地方添加全局配置?

【问题讨论】:

    标签: c# asp.net-web-api unity-container


    【解决方案1】:

    出现问题是因为您将新的 MyFilterAttribute 添加到过滤器集合(即:GlobalConfiguration.Configuration.Filters.Add(**new MyFilterAttribute()**)),而不是通过 Unity 解析的实例。由于 Unity 不参与实例的创建,因此它没有注入依赖项的触发器。这应该可以通过简单地通过 Unity 解析实例来解决。例如:

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

    【讨论】:

    • 谢谢你成功了,我现在就给你买啤酒,2杯!
    • 我只想应用到特定操作的过滤器呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多