Carter--模块化组织和管理.NET 6 Minimal API应用程序接口服务的利器

注:本文首发于码友网–《Carter–模块化组织和管理.NET 6 Minimal API应用程序接口服务的利器!!!

概述

亲爱的.NET开发者们,大家好!!!

我还是你们的老朋友,码友网的创建者和维护者–Rector。

今天我为大家分享的是.NET 6 Minimal APIs应用程序开发中模块化服务接口的轻量组件–Carter

早在.NET 6发布预览版的时候,我就发布过一篇关于《创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性》的文章,和大家一起预览了.NET 6中Minimal API的新特性。

如今(2021年12月),.NET 6正式版已发布近一个月时间了。相信有朋友已经将项目升级到.NET 6最新版本,或者基于.NET 6的Minimal APIs搭建并开发新的项目(特别是Web API项目)。

在Minimal APIs中,如果不使用控制器的方式管理接口,那么代码的可管理性和可阅读性是比较低的。官方给出的示例都是把所有接口方法,路由配置写在了Program.cs这一个文件中。

这对于代码量少的小项目还好,但如果项目稍微大一些,代码量则会增长迅速,将所有的代码全挤在一个Program.cs文件中肯定是不现实的。

那么,如何来模块化管理和维护.NET 6 Minimal APIs中的不同模块的接口代码就成了.NET开发人员头疼的问题。有什么办法可以更好地处理这个问题呢?

这时候,Carter就可能成为你的好朋友,Carter可以让.NET开发人员模块化开发基于.NET 6 Minimal APIs的接口服务,即:将不同功能的代码封装在不同的类文件中,你只需要继承ICarterModule接口即可。Carter会自动注册和路由实现了ICarterModule接口的所有服务。

下面,我们结合示例来体验Carter在.NET 6 Minimal APIs接口服务应用程序的模块化功能。

“Talk is cheap. Show me the code.”

创建Minimal APIs项目

1.首先,在Visual Studio 2022中创建一个基于.NET 6的Minimal APIs项目,这里命名为***MinimalApiDemo***。
2.打开Program.cs文件,删除其中多余的代码,删除后的代码如下:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.Run();

安装Carter程序包

打开NuGet程序包管理器,在其中搜索并安装Carter程序包,如下图:

添加Carter路由服务

Program.cs文件中分别添加builder.Services.AddCarter();app.MapCarter();语句,以注册Carter的服务及路由映射,代码如下:

using Carter;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddCarter();
var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.MapCarter();
app.Run();

创建测试模块

创建一个命名Modules的文件夹,并在其创建名为HomeModule.cs的模块文件,HomeModle继承自ICarterModule接口。其中ICarterModule提供了一个名为AddRoutes(IEndpointRouteBuilder app)的方法,在这个方法中添加需要路由映射即可,如下:

using Carter;

namespace MinimalApiDemo.Modules
{
    public class HomeModule : ICarterModule
    {
        public void AddRoutes(IEndpointRouteBuilder app)
        {
            app.MapGet("/", () => "Hello from Carter!");
        }
    }
}

运行项目,在浏览器中打开地址http://localhost:5066/,如果显示如下画面,则说明Carter服务注册成功并且正确扫描到了实现了ICarterModule的模块服务。

进一步模块化演示

为了体验更深入的模块化操作,以下分别创建了两个模块文件:HomeModule.csTodoModule.cs,演示项目结构如下图:

完整的示例代码如下:

HomeModule.cs

using Carter;
using Carter.ModelBinding;
using Carter.Request;
using Carter.Response;

namespace MinimalApiDemo.Modules
{
    public class HomeModule : ICarterModule
    {
        public void AddRoutes(IEndpointRouteBuilder app)
        {

            app.MapGet("/", () => "Hello from Carter!")
                .WithTags("Home")
                .WithMetadata("meta");
            app.MapGet("/qs", (HttpRequest req) =>
            {
                var ids = req.Query.AsMultiple<int>("ids");
                return $"It's {string.Join(",", ids)}";
            }).WithTags("Home");
            app.MapGet("/conneg", (HttpResponse res) => res.Negotiate(new { Name = "Dave" }))
                .WithTags("Home");
            app.MapPost("/validation", HandlePost)
                .WithTags("Home");
        }

        private IResult HandlePost(HttpContext ctx, Person person, IDatabase database)
        {
            var result = ctx.Request.Validate(person);

            if (!result.IsValid)
            {
                return Results.UnprocessableEntity(result.GetFormattedErrors());
            }

            var id = database.StorePerson(person);

            ctx.Response.Headers.Location = $"/{id}";
            return Results.StatusCode(201);
        }
    }

    public record Person(string Name);

    public interface IDatabase
    {
        int StorePerson(Person person);
    }

    public class Database : IDatabase
    {
        public int StorePerson(Person person)
        {
            //你的业务逻辑
            return 1;
        }
    }
}

TodoModule.cs

using Carter;
using Microsoft.AspNetCore.Mvc;

namespace MinimalApiDemo.Modules
{
    public class TodoModule : ICarterModule
    {
        public void AddRoutes(IEndpointRouteBuilder app)
        {
            app.MapGet("/todo/{id}", (int id) =>
            {
                return $"Todo item id is {id}.";
            }).WithTags("TodoGroup");
            app.MapPost("/todo/create", ([FromBody] TodoItem item) =>
            {
                return Results.Ok(item);
            }).WithTags("TodoGroup");
        }
    }

    public class TodoItem
    {
        public int Id { get; set; }
        public string? Name { get; set; }
    }
}

其中,示例HomeModule.cs中还用到了FluentValidation验证组件,PersonValidator.cs代码如下:

using FluentValidation;
using MinimalApiDemo.Modules;

namespace MinimalApiDemo.Validators
{
    public class PersonValidator : AbstractValidator<Person>
    {
        public PersonValidator()
        {
            RuleFor(p => p.Name).NotEmpty().WithMessage("Name cannot be empty.");
        }
    }
}

请自行安装FluentValidationNuGet程序包。

运行后的Swagger文档API如图:

希望通过本文的阅读,能为.NET 6 Minimal APIs的开发者们带来一些代码管理和维护上的便利,关于Carter的更多文档和示例,请参考Carter的官方托管地址

IB1ebb-1638756420729)]

希望通过本文的阅读,能为.NET 6 Minimal APIs的开发者们带来一些代码管理和维护上的便利,关于Carter的更多文档和示例,请参考Carter的官方托管地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码老头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值