ABP之动态WebAPI(一)
ABP在与页面交互中最。它让我们可以直接可以调用服务层(其实病没有跨过ApiController,只是将ApiController公共化,对于这一点的处理类似于MVC,对服务端的 调用没有跨过HttpHandler一样),这样不仅减少了ApiController的开发,也更能体现驱动领域设计的层结构。
对WebApi服务的替换与路由配置AbpWebApiModule是Abp.Web.Api的模块类,该类中定义InitializeAspNetServices,InitializeRoutes两个方法,并且在模块的Initialize方法中执行,这两个方法分别是对WebApi的服务的替换与路由的配置,。这两处对WebApi的变更才使得直接调用服务层成为可能。
private static void InitializeAspNetServices() { GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new AbpHttpControllerSelector(GlobalConfiguration.Configuration)); GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionSelector), new AbpApiControllerActionSelector()); GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new AbpControllerActivator()); } private static void InitializeRoutes() { DynamicApiRouteConfig.Register(); } public static void Register() { //Dynamic Web APIs (with area name) GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "AbpDynamicWebApi", routeTemplate: "api/services/{*serviceNameWithAction}" ); }
View Code对服务的分析与缓存
再对服务信息的存储上,作者提供了DynamicApiControllerInfo,DynamicApiActionInfo(源码中的DynamicApiMethodInfo.cs),其中DynamicApiControllerInfo包含了一DynamicApiActionInfo集合。
internal class DynamicApiControllerInfo { /// <summary> /// Name of the service. /// </summary> public string ServiceName { get; private set; } /// <summary> /// Controller type. /// </summary> public Type Type { get; private set; } /// <summary> /// Dynamic Action Filters for this controller. /// </summary> public IFilter[] Filters { get; set; } /// <summary> /// All actions of the controller. /// </summary> public IDictionary<string, DynamicApiActionInfo> Actions { get; private set; } /// <summary> /// Creates a new <see cref="DynamicApiControllerInfo"/> instance. /// </summary> /// <param>Name of the service</param> /// <param>Controller type</param> /// <param>Filters</param> public DynamicApiControllerInfo(string serviceName, Type type, IFilter[] filters = null) { ServiceName = serviceName; Type = type; Filters = filters ?? new IFilter[] { }; //Assigning or initialzing the action filters. Actions = new Dictionary<string, DynamicApiActionInfo>(StringComparer.InvariantCultureIgnoreCase); } }
View Code在执行AbpHttpControllerSelector, AbpApiControllerActionSelector, AbpControllerActivator的时候,系统已经在初始化的时候对服务层进行了分析与缓存。
在作者给的Demo SimpleTaskSystem下有一模块类SimpleTaskSystemWebApiModule
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69040.html