如何在现有项目中使用`Masa MiniApi`?
阅读原文时间:2023年07月11日阅读:1

首先我们现有创建一个空的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

MASA Framework (masastack.com)

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

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

来自token的分享

技术交流群:737776595