gpt4 book ai didi

c# - 具有全局 Web API 过滤器属性的 Unity 依赖注入(inject)

转载 作者:太空狗 更新时间:2023-10-29 20:01:19 25 4
gpt4 key购买 nike

引用此 CodePlex unity article我能够使用 WebAPI Controller 获取过滤器属性,如下所示:

[MyFilterAttribute]
public class TestController : ApiController
{}

但是,如果我想在具有 GlobalConfiguration 的所有操作中应用我的过滤器属性,它会被剥离注入(inject)的依赖项:

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

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

最佳答案

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

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

关于c# - 具有全局 Web API 过滤器属性的 Unity 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19794438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com