如何在现有项目中使用Masa MiniApi?

114 阅读4分钟

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

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

image.png

  1. 项目名称MFMiniApi

image.png

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

image.png

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

image.png 5. 安装Masa MiniApi

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

image.png

  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服务

image.png

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的委托,可用于权限认证、CORSnull

服务内配置

参数名参数描述默认值(未赋值为null)
BaseUri根地址
ServiceName服务名称
RouteHandlerBuilder基于RouteHandlerBuilder的委托,可用于权限认证、CORS
RouteOptions(对象)局部路由配置
DisableAutoMapRoute禁用自动映射路由
Prefix前缀
Version版本
AutoAppendId路由中是否包含{Id}font>, 例如: /api/v1/user/{id}
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