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

- 
项目名称 MFMiniApi

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

- 
这就是一个空的项目模板 

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

- 
安装一下 Swagger搜索 Swashbuckle.AspNetCore安装
- 
使用 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 "成功了吗"; } }
- 
启动项目,通过 MiniApi实现了注册Api服务

MasaMiniApi功能:
- 
服务分组[1]: 将API服务分别写到不同的 Service中
- 
自动映射路由[2]: 支持RESTful[3]标准 
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 | 禁用移除方法前缀(上方 Get、Post、Put、Delete请求的前缀) | false | 
| MapHttpMethodsForUnmatched | 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 | 支持 Post、Get、Delete、Put此方式Swagger不支持, 无法正常显示API | 
| Assemblies | 用于扫描服务所在的程序集 | MasaApp.GetAssemblies()(全局Assembly集合,默认为当前域程序集集合) | 
| RouteHandlerBuilder | 基于 RouteHandlerBuilder的委托,可用于权限认证、CORS[4]等 | null | 
服务内配置
| 参数名 | 参数描述 | 默认值(未赋值为null) | |
| BaseUri | 根地址 | ||
| ServiceName | 服务名称 | ||
| RouteHandlerBuilder | 基于RouteHandlerBuilder的委托,可用于权限认证、CORS[5]等 | ||
| RouteOptions(对象) | 局部路由配置 | ||
| DisableAutoMapRoute | 禁用自动映射路由 | ||
| Prefix | 前缀 | ||
| Version | 版本 | ||
| AutoAppendId | 路由中是否包含{Id}font>, 例如: /api/v1/user/{id} | ||
| PluralizeServiceName | 服务名称是否启用复数 | ||
| GetPrefixes | 用于识别当前方法类型为 Get请求 | ||
| PostPrefixes | 用于识别当前方法类型为 Post请求 | ||
| PutPrefixes | 用于识别当前方法类型为 Put请求 | ||
| DeletePrefixes | 用于识别当前方法类型为 Delete请求 | ||
| DisableTrimMethodPrefix | 禁用移除方法前缀(上方 Get、Post、Put、Delete请求的前缀) | ||
| MapHttpMethodsForUnmatched | 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 此方式Swagger不支持, 无法正常显示API | 
MiniApi文档
MASA Framework (masastack.com)[6]
这是官方文档地址,MasaFramework提供了很多的包都没有存在什么强依赖,都可以单独拿到项目中使用,这也是我目前一直学习Masaframework的原因,
好了MasaMiniApi的使用案例介绍到这里
来自token的分享
技术交流群:737776595
