网站制作前言公司/今日重大新闻事件
在WebApi的Filter过滤器中使用Unity进行依赖注入IOC
问题 在一个webapi中使用了unity作为ioc容器,然后给所有controller添加了一个身份认证的Filter,结果发现在Filter中无法注入,总是null,鼓捣了一会filterprovider也没弄好,最终换了个获取实例的方式,详细说一下
首先 给webapi添加一个过滤器
public static class WebApiConfig
{public static void Register(HttpConfiguration config){// Web API 配置和服务// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });//就是这个玩意config.Filters.Add(new JWTAttribute());}
}
再看看unity
下载的 Unity.AspNet.WebApi 的nuget包,自动生成了UnityConfig文件,在文件中配置上接口与实现类
//因为这个在过滤器中用于验证token是否正确,会频繁调用,所以我把它弄成了单例模式
container.RegisterSingleton<IAccountService,AccountServiceImpl>();
再看看Filter
直接进行注入的话,不管是属性还是构造器、方法注入,Service都是null,生气。
记得以前写java过滤器时好像也不能直接通过注解的方式,哈哈,具体的忘了,研究一下看看能不能通过其他方式获取。
在看UnityWebApiActivator这个文件发现是把UnityDependencyResolver赋值给了GlobalConfiguration.Configuration.DependencyResolver,所以就想到了这个。
总之解决了算是。
public class JWTAttribute : AuthorizeAttribute{//[Dependency]//public IAccountService Service { get; set; }//这个玩意 就这一句话private readonly IAccountService Service = (IAccountService)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IAccountService));protected override bool IsAuthorized(HttpActionContext actionContext){if (actionContext.Request.Headers.TryGetValues("token", out IEnumerable<string> data)){var token = data.FirstOrDefault();if (string.IsNullOrEmpty(token)){return false;}var result = Service.Validata(token);if (result.Success){return true;}}return false;}}
其实就是一句话,GlobalConfiguration.Configuration.DependencyResolver.GetService
高考了嘛,一想起高考就想凑字数 哈哈