使用全局Web APIfilter属性的Unitydependency injection
参考此CodePlex统一文章,我能够使用WebAPI控制器获取filter属性,如下所示:
[MyFilterAttribute] public class TestController : ApiController {}
但是,如果我想在使用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); } }
有没有更好的地方添加全局配置?
之所以出现此问题,是因为您要将新的MyFilterAttribute添加到filters集合(即: GlobalConfiguration.Configuration.Filters.Add(**new MyFilterAttribute()**)
),而不是通过Unity解析的实例。 由于Unity不参与实例的创建,因此它没有用于注入依赖项的触发器。 只需通过Unity解析实例就可以解决这个问题。 例如:
GlobalConfiguration.Configuration.Filters.Add((MyFilterAttribute)resolver.GetService(typeof(MyFilterAttribute()));
- Autofac:如何加载引用但未直接使用的程序集
- Web API ActionFilter修改返回的值
- asp.net核心中的TempData null
- WebAPI帮助页面:禁用生产版本
- 无法为generics类型创建TypeConverter
- 要调用此方法,“Membership.Provider”属性必须是“ExtendedMembershipProvider”的实例
- 使用MemoryStream和ZipArchive将zip文件返回到asp.net web api中的客户端
- ASP.Net Web Api – ApiExplorer不包含任何ApiDescriptions
- 在服务器端提供指纹比较的最佳方法