You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET新手求助:将MongoDB Minimal API请求迁移至PersonController

迁移Minimal API到PersonController步骤

1. 配置MongoDB依赖注入

首先在Program.cs中注册MongoDB客户端和Person集合,让控制器可以通过依赖注入获取集合实例:

// 替换为你的MongoDB连接字符串、数据库名和集合名
var mongoConnectionString = "mongodb://localhost:27017";
var databaseName = "YourDatabaseName";
var collectionName = "users";

builder.Services.AddSingleton<IMongoClient>(new MongoClient(mongoConnectionString));
builder.Services.AddSingleton<IMongoCollection<Person>>(sp =>
{
    var client = sp.GetRequiredService<IMongoClient>();
    var database = client.GetDatabase(databaseName);
    return database.GetCollection<Person>(collectionName);
});

2. 创建PersonController类

在项目中新建Controllers文件夹,添加PersonController.cs文件,继承ControllerBase并配置API控制器特性:

using Microsoft.AspNetCore.Mvc;
using MongoDB.Driver;

[ApiController]
[Route("api/users")] // 保持和原Minimal API一致的路由
public class PersonController : ControllerBase
{
    private readonly IMongoCollection<Person> _personCollection;

    // 构造函数注入MongoDB集合
    public PersonController(IMongoCollection<Person> personCollection)
    {
        _personCollection = personCollection;
    }

    // 对应原MapGet("/api/users")
    [HttpGet]
    public async Task<ActionResult<List<Person>>> GetAllUsers()
    {
        var users = await _personCollection.Find("{}").ToListAsync();
        return Ok(users);
    }

    // 对应原MapGet("/api/users/{id}")
    [HttpGet("{id}")]
    public async Task<ActionResult<Person>> GetUserById(string id)
    {
        var user = await _personCollection.Find(p => p.Id == id).FirstOrDefaultAsync();
        
        if (user == null)
        {
            return NotFound(new { message = "User is not found" });
        }
        
        return Ok(user);
    }

    // 对应原MapDelete("/api/users/{id}")
    [HttpDelete("{id}")]
    public async Task<ActionResult<Person>> DeleteUser(string id)
    {
        var deletedUser = await _personCollection.FindOneAndDeleteAsync(p => p.Id == id);
        
        if (deletedUser == null)
        {
            return NotFound(new { message = "User is not found" });
        }
        
        return Ok(deletedUser);
    }

    // 对应原MapPost("/api/users")
    [HttpPost]
    public async Task<ActionResult<Person>> CreateUser(Person user)
    {
        await _personCollection.InsertOneAsync(user);
        return CreatedAtAction(nameof(GetUserById), new { id = user.Id }, user);
    }

    // 对应原MapPut("/api/users")
    [HttpPut]
    public async Task<ActionResult<Person>> UpdateUser(Person userData)
    {
        var updatedUser = await _personCollection.FindOneAndReplaceAsync(
            p => p.Id == userData.Id, 
            userData, 
            new FindOneAndReplaceOptions<Person> { ReturnDocument = ReturnDocument.After });
        
        if (updatedUser == null)
        {
            return NotFound(new { message = "User is not found" });
        }
        
        return Ok(updatedUser);
    }
}

3. 清理原Minimal API代码

删除Program.cs中所有app.MapGet/MapPost/MapPut/MapDelete的Minimal API端点配置,避免路由冲突。

关键说明

  • 控制器通过依赖注入获取MongoDB集合,避免硬编码数据库连接,符合.NET开发规范。
  • 使用ActionResult<T>返回类型替代原Minimal API的Results方法,这是API控制器的标准写法,框架会自动处理HTTP状态码和序列化。
  • 创建用户时使用CreatedAtAction返回201状态码,并附带新资源的访问链接,比原代码更贴合REST规范。

内容的提问来源于stack exchange,提问作者Xerdriver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:49:51