我有与MongoDB一起工作的最小API,我需要将所有请求
方法添加到"PersonController"控制器中.我是.NET新手,我
不知道如何将这些请求放入控制器.
实际上,在.NET应用程序中创建API控制器非常简单,无论其版本如何.我不确定您使用的是哪个版本的.NET,但我将与您分享如何在.NET7中实现您的要求.
通过两种方式,您可以包括现有的最低API操作,或者创建新的API项目,或者在现有项目中创建新的API控制器.
在现有项目中创建新的API控制器:
- 使用控制器创建新的文件夹名称:
您应该具有以下文件夹和名称:
- 使用Person创建新的Web API控制器名称,并按以下方式替换您的代码:
[Route("api/[controller]")]
[ApiController]
public class PersonController : ControllerBase
{
private readonly PersonService _personService;
public PersonController(PersonService personService) =>
_personService = personService;
[HttpGet]
public async Task<List<Person>> Get() =>
await _personService.Find();
[HttpGet("{id:length(24)}")]
public async Task<ActionResult<Person>> Get(string id)
{
var person = await _personService.Find(id);
if (person is null)
{
return NotFound();
}
return person;
}
[HttpPost]
public async Task<IActionResult> Post(Person newPerson)
{
await _personService.InsertOneAsync(newPerson);
return CreatedAtAction(nameof(Get), new { id = newPerson.Id }, newPerson);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> Update(string id, Person updatedPerson)
{
var person = await _personService.Find(id);
if (person is null)
{
return NotFound();
}
updatedPerson.Id = person.Id;
await _personService.ReplaceOneAsync(id, updatedPerson);
return NoContent();
}
[HttpDelete("{id:length(24)}")]
public async Task<IActionResult> Delete(string id)
{
var person = await _personService.Find(id);
if (person is null)
{
return NotFound();
}
await _personService.DeleteOneAsync(id);
return NoContent();
}
}
演示模型:
public class Person
{
public string Id { get; set; }
public string Name { get; set; }
}
Mongo集合配置:
public class PersonDatabaseSettings
{
public string ConnectionString { get; set; } = null!;
public string DatabaseName { get; set; } = null!;
public string GetCollection { get; set; } = null!;
}
数据库收集服务:
public class PersonService
{
private readonly IMongoCollection<Person> _personCollection;
public PersonService(
IOptions<PersonDatabaseSettings> personDatabaseSettings)
{
var mongoClient = new MongoClient(
personDatabaseSettings.Value.ConnectionString);
var mongoDatabase = mongoClient.GetDatabase(
personDatabaseSettings.Value.DatabaseName);
_personCollection = mongoDatabase.GetCollection<Person>(
personDatabaseSettings.Value.GetCollection);
}
public async Task<List<Person>> Find() =>
await _personCollection.Find(_ => true).ToListAsync();
public async Task<Person?> Find(string id) =>
await _personCollection.Find(x => x.Id == id).FirstOrDefaultAsync();
public async Task InsertOneAsync(Person newPerson) =>
await _personCollection.InsertOneAsync(newPerson);
public async Task ReplaceOneAsync(string id, Person updatedPerson) =>
await _personCollection.ReplaceOneAsync(x => x.Id == id, updatedPerson);
public async Task DeleteOneAsync(string id) =>
await _personCollection.DeleteOneAsync(x => x.Id == id);
}
Note:我正在使用额外的服务等级,但您可以继续,您的方法也是如此.
Program.cs:
由于您已经使用了最低版本的API,因此在使用API控制器时,您应该按如下方式更新您的Program.cs文件:
using APIProject.Controllers;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<PersonDatabaseSettings>(
builder.Configuration.GetSection("PersonDatabase"));
// Add services to the container.
builder.Services.AddSingleton<PersonService>();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Note: WEN应在Program.cs中注册Mongo DB客户端和PersonService DI,同上.
输出:
我还没有在我的VM中安装mongo db实例,因此收集将
引发空引用异常,但如果存在
数据收集.
Note:以获取任何实施挑战或进一步信息please refer to this official document.