ASP .NET之动态WebApi实践

动态WebApi实践

  • 框架名称 SunLight.DynamicWebApi
  • 创建一个普通的WebApi
  • 引入Swagger Api界面(可选)
    • 2.1 为什么要引入?
    • 2.2 如何引入
      • 2.2.1 安装框架
      • 2.2.2 修改SwaggerConfig.cs
      • 2.2.3 创建项目XML注释文档
      • 2.2.4 修改WebApiConfig.cs
      • 2.2.5 测试Swagger
  • 引入SunLight.DynamicWebApi框架
    • 3.1 如何引入
    • 3.2 如何使用
      • 3.2.1 WebApi项目中创建模块
      • 3.3.2 修改Global.asax.cs
      • 3.3.3 新建Application层,即一个动态WebApi
      • 3.3.4 修改WebApi项目Module类
      • 3.3.5 修改WebApiConfig.cs
      • 3.3.6 启动项目,搭建完成

由于项目需求,领导希望剥离服务端的WebApi Controller层的实现,通过反射项目来实现动态的Api,即根据服务端加载的模块,动态的生成Api。忽然想起了Abp框架中已经实现了此功能,在查阅了相关资料后,大胆实现了一个初版的动态WebApi框架,这节不讲原理,我们首先看如何使用这个框架。

框架名称 SunLight.DynamicWebApi

这段只是打个广告,名字来源于Dota英雄卡尔的技能之一,SunLight(天火),希望有兴趣的兄弟一起刮痧对面。

创建一个普通的WebApi

步骤如下:
ASP .NET之动态WebApi实践_第1张图片

ASP .NET之动态WebApi实践_第2张图片
新创建的WebApi结构如下:
ASP .NET之动态WebApi实践_第3张图片
此时,直接运行程序,我们可以在浏览器中看到默认的Api
ASP .NET之动态WebApi实践_第4张图片

引入Swagger Api界面(可选)

2.1 为什么要引入?

1.方便后端人员进行Api的测试,方便前端人员来参考调用Api
2.能够根据代码注释自动生成Api接口文档
3.外貌主义,谁不爱美呢?Swagger较之前的WebApiTest等Api测试框架相比,美了十个AMS

2.2 如何引入

2.2.1 安装框架

在解决方案上,右键选择管理NuGet程序包,在打开的界面中搜索Swashbuckle,如下图,然后安装即可。
ASP .NET之动态WebApi实践_第5张图片

2.2.2 修改SwaggerConfig.cs

框架安装完成后,找到WebApi项目App_Start目录下生成的SwaggerConfig类
ASP .NET之动态WebApi实践_第6张图片
通过修改该类,我们可以修改Api的版本号,标题之类的信息
ASP .NET之动态WebApi实践_第7张图片

ASP .NET之动态WebApi实践_第8张图片

2.2.3 创建项目XML注释文档

右键项目→属性→生成→选中下方的 “XML文档文件” 然后保存

ASP .NET之动态WebApi实践_第9张图片

然后在SwaggerConfig.cs的EnableSwagger中启用配置


c.IncludeXmlComments(System.IO.Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin\\DynamicWebApi.xml"));

2.2.4 修改WebApiConfig.cs

在App_Start目录下,修改WebApiConfig.cs文件

 config.Routes.MapHttpRoute(
               name: "DefaultApi",
               //修改了这里,在controller和id中间加了action
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );

2.2.5 测试Swagger

在Controller下添加一个静态的Api,可以Copy我这个进去,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace DynamicWebApi.Controllers
{
    /// 
    /// 静态的Api控制器
    /// 
    public class StaticController : ApiController
    {

        /// 
        /// 问好方法
        /// 
        /// 名字
        /// 问好实体
        [HttpGet]
        public ResultEntity SayHello(string UserName)
        {
            return new ResultEntity()
            {
                Code = 400,
                Msg = string.Format("Hello {0}", UserName)
            };
        }


        /// 
        /// 问别方法
        /// 
        /// 名字
        /// 问别实体
        [HttpGet]
        public ResultEntity SayBye(string UserName)
        {
            return new ResultEntity()
            {
                Code = 400,
                Msg = string.Format("ByeBye {0}", UserName)
            };
        }


        /// 
        /// 创建一个用来测试Swagger界面返回的实体
        /// 
        public class ResultEntity
        {
            /// 
            /// 返回码
            /// 
            public int Code { get; set; }

            /// 
            /// 返回信息
            /// 
            public string Msg { get; set; }
        }

    }
}

启动项目,在浏览器地址后面输入Swagger,回车即可看到如下界面,恭喜,成功啦~
ASP .NET之动态WebApi实践_第10张图片

引入SunLight.DynamicWebApi框架

3.1 如何引入

目前只能从CSDN上下载类库,直接以添加现有项目的方式添加入解决方案,下载地址
下载地址

3.2 如何使用

3.2.1 WebApi项目中创建模块

在App_Start目录下,创建一个模块,如下:

    /// 
    /// WebApi层模块类
    /// 
    public class WebApiModule : SunLightModule
    {
    }

3.3.2 修改Global.asax.cs

修改继承基类为SunLight.Dynamic.DynamicApiApplication,如下:

		/// 
        /// 注意,此处方法是Override
        /// 
        protected override void Application_Start()
        {
            //请注意必须调用父类方法
            base.Application_Start();

            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

3.3.3 新建Application层,即一个动态WebApi

1.新建一个类库DemoApplicaiton
2.定义一个接口,继承自SunLight.Dynamic.IApplicationService

	/// 
    /// 英雄相关接口
    /// 
    public interface IHeroService : IApplicationService
    {

        /// 
        /// 根据英雄类别获取英雄列表
        /// 
        /// 英雄类别,0智力,1力量,2敏捷
        /// 
        List<HeroOutputDto> GetHeroListByType(int type);


        /// 
        /// 根据英雄Id获取英雄
        /// 
        /// 
        /// 
        HeroOutputDto GetHeroById(int Id);
    }

3.定义该接口的实现类

 public class HeroService : ApplicatonService, IHeroService
    {

        /// 
        /// 根据英雄Id获取英雄
        /// 
        /// 
        /// 
        public HeroOutputDto GetHeroById(int Id)
        {
            var allheros = GetAllHeroList();
            var wantHero = allheros.Find(m => m.HeroId == Id);
            return wantHero;
        }


        /// 
        /// 根据英雄类别获取英雄列表
        /// 
        /// 英雄类别,0智力,1力量,2敏捷
        /// 
        public List<HeroOutputDto> GetHeroListByType(int type)
        {
            if (!Enum.IsDefined(typeof(HeroType), type))
                return null;
            HeroType Type = (HeroType)Enum.ToObject(typeof(HeroType), type);

            var allheros = GetAllHeroList();
            var wantHeroList = allheros.FindAll(m => m.HeroType == Type);
            return wantHeroList;
        }



        /// 
        /// 模拟一些数据
        /// 
        /// 
        private List<HeroOutputDto> GetAllHeroList()
        {
            List<HeroOutputDto> result = new List<HeroOutputDto>();

            result.Add(new HeroOutputDto() { HeroId = 0, HeroName = "Kaer", HeroType = HeroType.智力 });
            result.Add(new HeroOutputDto() { HeroId = 1, HeroName = "蓝胖", HeroType = HeroType.智力 });
            result.Add(new HeroOutputDto() { HeroId = 2, HeroName = "Lina", HeroType = HeroType.智力 });
            result.Add(new HeroOutputDto() { HeroId = 3, HeroName = "黑鸟", HeroType = HeroType.智力 });


            result.Add(new HeroOutputDto() { HeroId = 4, HeroName = "斧王", HeroType = HeroType.力量 });
            result.Add(new HeroOutputDto() { HeroId = 5, HeroName = "骷髅王", HeroType = HeroType.力量 });
            result.Add(new HeroOutputDto() { HeroId = 6, HeroName = "伐木机", HeroType = HeroType.力量 });


            result.Add(new HeroOutputDto() { HeroId = 7, HeroName = "幻影刺客", HeroType = HeroType.敏捷 });
            result.Add(new HeroOutputDto() { HeroId = 8, HeroName = "剑圣", HeroType = HeroType.敏捷 });
            result.Add(new HeroOutputDto() { HeroId = 9, HeroName = "小骷髅", HeroType = HeroType.敏捷 });
            return result;
        }
    }

4.创建Appcation层的模块Module并重写init方法,注册service

public class DemoModule : SunLightModule
    {
        protected override void Init()
        {
            base.Init();

            //注册
            DynamicHttpControllerManager.RegisterType<IHeroService, HeroService>();
        }
    }

5.创建Applicaiton层项目Xml注释文档并加入Swagger,可参考2.2.3
ASP .NET之动态WebApi实践_第11张图片
并在webApi项目的SwaggerConfig中添加此配置文件

c.IncludeXmlComments(System.IO.Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "bin\\DemoApplication.xml"));

3.3.4 修改WebApi项目Module类

在WebApi项目的Module类上添加注解,想要生成几个Applcaiton项目的Api,就依赖几个,如注解内的注释代码

   /// 
    /// WebApi层模块类
    /// 
    [DependsOn(typeof(DemoModule)/*, DependsOn(typeof(Demo2Module)*/)]
    public class WebApiModule : SunLightModule
    {
    }

3.3.5 修改WebApiConfig.cs

在App_Start目录下,添加如下内容

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            //添加动态webApu路由
            config.Routes.MapHttpRoute(
                name: "DynamicWebApi",
                routeTemplate: "services/{ServiceName}/{ActionName}"
               );
        }
    }

3.3.6 启动项目,搭建完成

启动项目,并在浏览器地址栏输入Swagger后回车,即可看到根据Applicaiton动态生成的Api,还等什么,调用试试,享受下胜利的果实。
ASP .NET之动态WebApi实践_第12张图片

你可能感兴趣的:(Asp,.Net之动态WebApi,c#)