首先我们现有创建一个空的WebApi的项目模板,这个项目模板和MasaFramework本身没有任何关联,我们本博客只是使用的MasaFrameworkMiniApi的包

  1. 创建Asp.NET Core 空的项目模板

  1. 项目名称MFMiniApi

  1. 其他信息看图,取消Https配置,也可以选择,

  1. 这就是一个空的项目模板

  2. 安装Masa MiniApi

    搜索Masa.Contrib.Service.MinimalAPIs ,请注意选择到包括发行版,由于1.0未发版,所以先用预览版

  1. 安装一下Swagger

    搜索Swashbuckle.AspNetCore安装

  2. 使用MasaMiniApi

    修改Program.cs代码

    using Microsoft.OpenApi.Models;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddEndpointsApiExplorer();
    
    builder.Services.AddSwaggerGen(options =>
    {
    options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    }); var app = builder.AddServices(); app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    }); await app.RunAsync();

    创建Service文件夹然后创建DemoService.cs

    内部代码:

    namespace MFMiniApi.Service;
    
    public class DemoService : ServiceBase
    {
    public string PostAsync()
    {
    return "成功了吗";
    }
    }
  3. 启动项目,通过MiniApi实现了注册Api服务

MasaMiniApi功能:

Minimal APIs十分轻量,写法十分简单,可正因为如此,也给我们带来一些编码上的问题,下面我们来看一下原生Minimal APIs的写法与Masa提供的Minimal APIs的写法的区别

原生写法

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build(); app.MapGet("/api/v1/users/{id}", (Guid id)=>
{
// todo: 查询用户信息
var user = new User()
{
Id = id,
Name = "Tony"
};
return Task.FromResult(Results.Ok(user));
}); app.MapPost("/api/v1/users", ([FromBody] UserRequest request)=>
{
//todo: 添加用户逻辑
return Task.FromResult(Results.Accepted());
}); app.MapDelete("/api/v1/users/{id}",(Guid id)=>
{
//todo: 删除用户逻辑
return Task.FromResult(Results.Accepted());
}); app.MapPut("/api/v1/users/{id}",(Guid id, [FromBody] EditUserRequest request)=>
{
//todo: 修改用户逻辑
return Task.FromResult(Results.Accepted());
}); app.Run();

MasaMiniApi

创建UserService.cs,使用案例自动注册

using Microsoft.AspNetCore.Mvc;

namespace MFMiniApi.Service;

public class UserService : ServiceBase
{
/// <summary>
/// Get: /api/v1/users/{id}
/// </summary>
public Task<IResult> GetAsync(Guid id)
{
// todo: 查询用户信息
var user = new User()
{
Id = id,
Name = "Tony"
};
return Task.FromResult(Results.Ok(user));
} /// <summary>
/// Post: /api/v1/users
/// </summary>
public Task<IResult> AddAsync([FromBody] UserRequest request)
{
//todo: 添加用户逻辑
return Task.FromResult(Results.Accepted());
} /// <summary>
/// Delete: /api/v1/users/{id}
/// </summary>
public Task<IResult> DeleteAsync(Guid id)
{
//todo: 删除用户逻辑
return Task.FromResult(Results.Accepted());
} /// <summary>
/// Put: /api/v1/users/{id}
/// </summary>
public Task<IResult> UpdateAsync(Guid id, [FromBody] EditUserRequest request)
{
//todo: 修改用户逻辑
return Task.FromResult(Results.Accepted());
}
}

UserService.cs,使用案例手动注册

public class UserService : ServiceBase
{
public UserService()
{
RouteOptions.DisableAutoMapRoute = true;//当前服务禁用自动注册路由 App.MapGet("/api/v1/users/{id}", GetAsync);
App.MapPost("/api/v1/users", AddAsync);
App.MapDelete("/api/v1/users/{id}", DeleteAsync);
App.MapPut("/api/v1/users/{id}", UpdateAsync);
} public Task<IResult> GetAsync(Guid id)
{
// todo: 查询用户信息
var user = new User()
{
Id = id,
Name = "Tony"
};
return Task.FromResult(Results.Ok(user));
} public Task<IResult> AddAsync([FromBody] UserRequest request)
{
//todo: 添加用户逻辑
return Task.FromResult(Results.Accepted());
} public Task<IResult> DeleteAsync(Guid id)
{
//todo: 删除用户逻辑
return Task.FromResult(Results.Accepted());
} public Task<IResult> UpdateAsync(Guid id, [FromBody] EditUserRequest request)
{
//todo: 修改用户逻辑
return Task.FromResult(Results.Accepted());
}
}

MasaMiniApi全局配置

参数名 参数描述 默认值
DisableAutoMapRoute 禁用自动映射路由 false
Prefix 前缀 api
Version 版本 v1
AutoAppendId 路由中是否包含{Id}, 例如: /api/v1/user/ true
PluralizeServiceName 服务名称是否启用复数 true
GetPrefixes 用于识别当前方法类型为Get请求 new List<string> { "Get", "Select", "Find" }
PostPrefixes 用于识别当前方法类型为Post请求 new List<string> { "Post", "Add", "Upsert", "Create", "Insert" }
PutPrefixes 用于识别当前方法类型为Put请求 new List<string> { "Put", "Update", "Modify" }
DeletePrefixes 用于识别当前方法类型为Delete请求 new List<string> { "Delete", "Remove" }
DisableTrimMethodPrefix 禁用移除方法前缀(上方GetPostPutDelete请求的前缀) false
MapHttpMethodsForUnmatched 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 支持PostGetDeletePut 此方式Swagger不支持, 无法正常显示API
Assemblies 用于扫描服务所在的程序集 MasaApp.GetAssemblies()(全局Assembly集合,默认为当前域程序集集合)
RouteHandlerBuilder 基于RouteHandlerBuilder的委托,可用于权限认证、CORS null

服务内配置

参数名 参数描述 默认值(未赋值为null)
BaseUri 根地址
ServiceName 服务名称
RouteHandlerBuilder 基于RouteHandlerBuilder的委托,可用于权限认证、CORS
RouteOptions(对象) 局部路由配置
DisableAutoMapRoute 禁用自动映射路由
Prefix 前缀
Version 版本
AutoAppendId 路由中是否包含{Id}font>, 例如: /api/v1/user/
PluralizeServiceName 服务名称是否启用复数
GetPrefixes 用于识别当前方法类型为Get请求
PostPrefixes 用于识别当前方法类型为Post请求
PutPrefixes 用于识别当前方法类型为Put请求
DeletePrefixes 用于识别当前方法类型为Delete请求
DisableTrimMethodPrefix 禁用移除方法前缀(上方GetPostPutDelete请求的前缀)
MapHttpMethodsForUnmatched 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 此方式Swagger不支持, 无法正常显示API

MiniApi文档

MASA Framework (masastack.com)

这是官方文档地址,MasaFramework提供了很多的包都没有存在什么强依赖,都可以单独拿到项目中使用,这也是我目前一直学习Masaframework的原因,

好了MasaMiniApi的使用案例介绍到这里

来自token的分享

技术交流群:737776595

如何在现有项目中使用`Masa MiniApi`?的更多相关文章

  1. 现有项目中集成Flutter

    本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的 ...

  2. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...

  3. 如何实现在react现有项目中嵌入Blazor?

    如何实现在react现有项目中嵌入Blazor? 目前官方只提供了angular和react俩种示例所以本教程只将react教程 思路讲解: 首先在现有react项目中我们可能某些组件是在Blazor ...

  4. React Native 在现有项目中的探路

    移动开发中,native开发性能和效果上无疑是最好的. 但是在众多的情况下,native开发并不是最优的选择.当需求经常改动的时候,当预算有限的时候,当deadline很近的时候,native开发的成 ...

  5. 集成activiti到现有项目中

    1.在lib中添加相关的jar包 2.找到一个activiti.cfg.xml,若是想用现有的数据库需要配置 <?xml version="1.0" encoding=&qu ...

  6. 如何在现有的Vue项目中嵌入 Blazor项目?

    目前官方只提供了angular和react俩种示例,所以本教程将来讲解如何在Vue的现有项目中使用,上期已经做好了react的教材! 准备流程 Vue 项目创建流程 使用Vue创建一个Demo项目 全 ...

  7. 如何使用vs将现有的项目或者文件夹(尤其是多层目录的)添加到项目中

    困扰我这么久的问题,哎,真心弱爆了! 1.将现有项目或文件夹拷贝到指定目录下 2.解决方案右上有个显示所有文件的按钮 然后选中所有要添加的文件,右击 选择包含到项目中即可

  8. 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结

    将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...

  9. Atitit.css 规范 bem  项目中 CSS 的组织和管理

    Atitit.css 规范 bem  项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...

  10. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

随机推荐

  1. ZFBJ - 1 - 42 - NO.2

  2. 【搭建】【转】搭建 yum仓库

    https://blog.csdn.net/wuxingge/article/details/100761637 3.2 服务端部署 1)安装软件程序(createrepo) yum install ...

  3. windows消息机制_PostMessage和SendMessage

    1.子线程中建立一个窗口 为了在后面比较这两个函数,先使用win32 windows程序中建立子线程,在子线程中建立一个窗口. (1)新建一个 win32 windows应用程序 (2)定义子窗口的窗 ...

  4. MyBatis-Plus使用SQL语句

    项目中碰到一个必须要使用动态SQL的地方, 想着在xml文件中进行一层一层的判断太麻烦了,也不好理解,要是能在Java代码中组织好SQL,进行查询操作 QueryWrapper<object&g ...

  5. 【javascript】chormeV8源码阅读之 GC(垃圾回收)过程 笔记

    1.为何需要垃圾回收     在V8引擎逐行执行JavaScript代码的过程中,当遇到函数的情况时,会为其创建一个函数执行上下文(Context)环境并添加到调用堆栈的栈顶,函数的作用域(handl ...

  6. app工程目录结构

    一.APP工程目录结构 APP工程分为两个层次,第一个层次是项目(这里在eclipse中是指workspace),另一个层次是模块(这里在eclipse中是指project) 模块依附于项目,每个项目 ...

  7. elementui中对样式的修改标签

    /deep/ .el-drawer.rtl { -webkit-animation: rtl-drawer-out .3s; animation: rtl-drawer-out .3s; backgr ...

  8. echart 解决setOption线残留

    前言: Antd + echarts 我想要实现的是点击表的某一行自动生成对应的折线图,我在点击第一行生成5条线,我在点击第二行的时候,本该生成2条线,结果还是5条线: 最开始我以为设置的 serie ...

  9. Android笔记--FileProvider

    FileProvider介绍 继承于ContentProvider,本质上依旧是用于跨境通信,对第三方应用暴露文件,并授予文件读写地权限 具体内容 1.在Strings.xml里面配置一个常量 2.在 ...

  10. ovs-dpdk:revalidator源码解析

    revalidator是做什么的?需要知道哪些东西? 有关于revalidator需要弄明白的是以下三个问题: 通过ovs-vsctl list open_vs可以看到other_config里面有两 ...