首先我们现有创建一个空的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
功能:
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等 |
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 | 禁用移除方法前缀(上方Get 、Post 、Put 、Delete 请求的前缀) |
||
MapHttpMethodsForUnmatched | 通过方法名前缀匹配请求方式失败后,路由将使用指定的HttpMethod发起请求 此方式Swagger不支持, 无法正常显示API |
MASA Framework (masastack.com)
这是官方文档地址,MasaFramework
提供了很多的包都没有存在什么强依赖,都可以单独拿到项目中使用,这也是我目前一直学习Masaframework
的原因,
好了MasaMiniApi
的使用案例介绍到这里
来自token的分享
技术交流群:737776595