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