如何在現有專案中使用`Masa MiniApi`?

tokengo發表於2023-04-18

首先我們現有建立一個空的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

相關文章