如何更好地组织最小 WEB API 代码结构

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更好地组织最小 WEB API 代码结构相关的知识,希望对你有一定的参考价值。

前言

我们在《.NET 6新特性试用》中讲过,随着项目需求和复杂性的增加,单个文件的最小 WEB API 会变得非常臃肿。

而且,Program.cs 应该只放启动和初始化代码。不应该包含太多 MapXXX 方法。

那么,如何以更好的方式组织最小 WEB API 代码结构呢?

1. 静态帮助类

可以将它们移到单独的类中。

例如,你可以创建一个名为 MinimalApiHelper 的静态类并向其添加静态方法:

public static class MinimalApiHelper

    public static void RegisterWeatherForecastAPIs(WebApplication app)
    
        var summaries = new[]
        
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        ;

        app.MapGet("/weatherforecast", () =>
        
            ......
        )
        .WithName("GetWeatherForecast");
    

Program.cs 修改如下:

......

app.UseHttpsRedirection();

MinimalApiHelper.RegisterWeatherForecastAPIs(app);

app.Run();

2. 扩展方法

更进一步,可以将这些静态方法创建为 WebApplication 类的扩展方法:

public static void RegisterWeatherForecastAPIs(this WebApplication app)

    ......

可以像这样简化调用代码:

......

app.RegisterWeatherForecastAPIs();

app.Run();

3. 依赖注入

但是,存在大量服务时,需要多次执行注册代码:

app.RegisterService1APIs();
app.RegisterService2APIs();
......

我们可以使用依赖注入简化注册代码。

实现代码如下:

public  static class MinimalApiExtentions

    public static void AddMinimalApiRegisters(this IServiceCollection services, params Type[] types)
    
        var registers = new List<IMinimalApiRegister>();
        foreach (var type in types)
        
            registers.AddRange(type.Assembly.GetTypes()
                .Where(x => typeof(IMinimalApiRegister).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
                .Select(Activator.CreateInstance).Cast<IMinimalApiRegister>());
        

        services.AddSingleton<IEnumerable<IMinimalApiRegister>>(registers);
    

    public static void UseMinimalApiRegisters(this WebApplication app)
    
        var registers = app.Services.GetRequiredService<IEnumerable<IMinimalApiRegister>>();

        foreach (var register in registers)
        
            register.RegisterAPIs(app);
        
    

Program.cs 修改如下:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMinimalApiRegisters(typeof(Program));

var app = builder.Build();
app.UseMinimalApiRegisters();
app.Run();

遍历程序集中的所有 IMinimalApiRegister 实现类,然后遍历调用实现类的 RegisterAPIs 方法。

示例实现类如下:

public class Service1Register : IMinimalApiRegister
 
    public void RegisterAPIs(WebApplication app)
    
        app.MapGet("/", () => "Hello My IO");
    

结论

今天,我们介绍了如何组织最小 WEB API 代码结构。

如果你有更好的方案,欢迎到我的公众号“My IO”留言讨论

以上是关于如何更好地组织最小 WEB API 代码结构的主要内容,如果未能解决你的问题,请参考以下文章

如何更好的设计RESTful API

如何更好地组织这两个连续的 IF 语句?

依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性

#yyds干货盘点#想说爱你不容易 | 使用最小 WEB API 实现文件上传

用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码

如何组织项目的目录结构