使用全局Web API过滤器属性的Unity依赖注入

Bla*_*ell 7 c# unity-container asp.net-web-api

参考此CodePlex统一文章,我能够使用WebAPI控制器获取过滤器属性,如下所示:

[MyFilterAttribute]
public class TestController : ApiController
{}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在使用GlobalConfiguration的所有操作中应用我的filter属性,它将被剥离注入的依赖项:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*oiu 14

之所以出现此问题是因为您要将新的MyFilterAttribute添加到filters集合(即:),GlobalConfiguration.Configuration.Filters.Add(**new MyFilterAttribute()**)而不是通过Unity解析的实例.由于Unity不参与实例的创建,因此它没有用于注入依赖项的触发器.只需通过Unity解析实例就可以解决这个问题.例如:

GlobalConfiguration.Configuration.Filters.Add((MyFilterAttribute)resolver.GetService(typeof(MyFilterAttribute()));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的工作,我现在给你买啤酒,做那个2! (3认同)