惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
C
Check Point Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Know Your Adversary
Know Your Adversary
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
Latest news
Latest news
Project Zero
Project Zero
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
P
Privacy International News Feed
Vercel News
Vercel News
T
The Exploit Database - CXSecurity.com
S
Secure Thoughts
Application and Cybersecurity Blog
Application and Cybersecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Full Disclosure
T
Tenable Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Security Affairs
The GitHub Blog
The GitHub Blog
J
Java Code Geeks
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
O
OpenAI News
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
Engineering at Meta
Engineering at Meta
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
News and Events Feed by Topic
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog
Schneier on Security
Schneier on Security
W
WeLiveSecurity
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 三生石上(FineUI控件)

博客园 - 广阔之海

Halcon的三角函数 Halcon轮廓插值方法 C# 控件选项变化事件处理 深度学习执行速度不稳定的解决方法 Halcon - 深度学习 - 目标分类 Halcon 画一个时钟 Halcon 解方程(solve_matrix) C# 使用Serilog日志框架 Halcon 生成标定板 Halcon 中的形态学 Halcon的提取中心线算法 C# 消灭switch的面向映射编程 C#中Task的用法 Halcon 通过坐标轴过滤点云数据 Halcon图像投影映射 C# 获取MySql的数据库结构信息 C# HttpClient的使用方法总结 MySql字符集导致特殊字符保存出错问题处理 Asp.Net Core WebApi中集成Jwt认证
Asp.Net Core 动态生成WebApi
广阔之海 · 2022-05-30 · via 博客园 - 广阔之海

在WebApi架构体系中,一般需要先编写应用服务实现,再通过编写Controller来实现应用服务的Web接口。Controller中的代码作用仅仅是调用Service的方法,将Service提升为Web接口,其实完全可以通过动态生成WebApi来减少编码工作。在.Net示例项目ABP中已经实现了动态生成WebApi的功能,Panda.DynamicWebApi项目将这部分代码进行了抽取和封装,我们可以通过引用Panda.DynamicWebApi项目来实现动态生成WebApi。

第一步,通过Nuget添加Panda.DynamicWebApi的项目引用

在VS2019的Nuget包管理器中,搜索并添加Panda.DynamicWebApi的项目引用。

第二步,给Service添加[DynamicWebApi]特性,并继承IDynamicWebApi接口

   [DynamicWebApi]
    [ApiExplorerSettings(GroupName = "v1")]
    public class UserAppService : IDynamicWebApi
    {
        public List<UserInfo> GetUserList()
        {
            var userList = new List<UserInfo>();
            userList.Add(new UserInfo()
            {
                UserId = 1,
                UserName = "张三",
                PhoneNum = "13344455566",
                Address = "北京"
            });
            userList.Add(new UserInfo()
            {
                UserId = 2,
                UserName = "李四",
                PhoneNum = "13322233344",
                Address = "天津"
            });
            userList.Add(new UserInfo()
            {
                UserId = 3,
                UserName = "王五",
                PhoneNum = "13355566677",
                Address = "上海"
            });
            return userList;
        }
    }

注意:

(1)DynamicWebApi默认的服务命名后缀是AppService,这个可以配置;
(2)使用DynamicWebApi,必须在服务类上添加特性[ApiExplorerSettings(GroupName = "v1")],指定GroupName才能让Swagger展示接口;
(3)DynamicWebApi有一套默认的请求方式命名规则,这个可以自行配置,也可配置为全部是POST方式
第三步,在Startup类中的ConfigureServices方法中,配置启用DynamicWebApi

            // 自定义配置
            services.AddDynamicWebApi((options) =>
            {
                // 指定全局默认的 api 前缀
                options.DefaultApiPrefix = null;

                // 指定全局默认的去除控制器后缀
                options.RemoveControllerPostfixes = new List<string>() { "Service" };

                // 清空API结尾,不删除API结尾;若不清空 CreatUserAsync 将变为 CreateUser
                options.RemoveActionPostfixes.Clear();

                // 自定义 ActionName 处理函数;
                options.GetRestFulActionName = (actionName) => actionName;
            });