動態 Restful API 生成

介紹

通常在DDD開發架構中,我們寫完服務層需要在控制器中寫API,今天介紹一個組件 Plus.AutoApi 可以用它來動態生成 Restful 風格的 WebApi,不用寫 Controller。

快速使用

在你的應用服務層中添加組件

Install-Package Plus.AutoApi

在 Startup 中註冊 AutoApi

public void ConfigureServices(IServiceCollection services)
{
    services.AddAutoApi(x => { });
}

AddAutoApi 同時也支持各種 Options 參數,可以自行查看。

讓你的服務直接或者間接實現IAutoApi,添加特性[AutoApi]即可,示例代碼如下:

[AutoApi]
public class WeatherService : IAutoApi
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    public IEnumerable<WeatherForecast> Get()
    {
        return WeatherForecast();
    }

    [HttpGet("{id}")]
    public IEnumerable<WeatherForecast> Get(int id)
    {
        return WeatherForecast();
    }

    public IEnumerable<WeatherForecast> Post()
    {
        return WeatherForecast();
    }

    [HttpPut("{id}")]
    public IEnumerable<WeatherForecast> Put(int id)
    {
        return WeatherForecast();
    }

    [HttpDelete("{id}")]
    public IEnumerable<WeatherForecast> Delete(int id)
    {
        return WeatherForecast();
    }

    private static IEnumerable<WeatherForecast> WeatherForecast()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        }).ToArray();
    }
}

需要注意的是你的服務層命名規範,默認要以Service或者ApplicationService結尾,也可以通過配置替換默認名稱。

如果你想讓某個服務不自動生成API,可以給特性傳遞參數:[AutoApi(Disabled = true)]

讓生成的API兼容 Swagger,需要添加下面這句代碼。

services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Title = "Plus AutoApi Sample",
        Version = "v1.0.0"
    });
    options.DocInclusionPredicate((docName, description) => true);
});

同時自動生成API也可以和控制器共存,互不影響。你可以手動指定HTTP方法,也可以根據默認規則自動創建。

默認自動創建HTTP方法的規則如下:

static PlusConsts()
{
    HttpVerbs = new Dictionary<string, string>()
    {
        ["add"] = "POST",
        ["create"] = "POST",
        ["post"] = "POST",
        ["insert"] = "POST",
        ["get"] = "GET",
        ["find"] = "GET",
        ["fetch"] = "GET",
        ["query"] = "GET",
        ["update"] = "PUT",
        ["put"] = "PUT",
        ["delete"] = "DELETE",
        ["remove"] = "DELETE"
    };
}

上面代碼最終生成的API路由如下:

Samples

https://github.com/Meowv/Plus.AutoApi/tree/master/samples/Plus.AutoApi.Sample

Nuget

https://www.nuget.org/packages/Plus.AutoApi

開源地址

https://github.com/Meowv/Plus.AutoApi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章