A comunicação entre aplicações .NET modernas e o banco de dados MongoDB tornou-se mais robusta, escalável e produtiva com os avanços das versões recentes da plataforma .NET (como .NET 6, .NET 7 e .NET 8) e a evolução do próprio driver MongoDB para C#. Neste artigo, vamos explorar as melhores práticas, abordagens modernas e exemplos de código prático para integração entre C# e MongoDB.
🧱 Por que MongoDB com .NET?
MongoDB é um banco NoSQL orientado a documentos, que armazena dados em formato BSON (um tipo binário de JSON). Isso o torna extremamente flexível para aplicações que evoluem rapidamente, com requisitos de schema dinâmico.
Aliado ao C#, oferece:
- Facilidade de serialização e deserialização com
System.Text.Json
ouNewtonsoft.Json
- Performance em consultas assíncronas com
async/await
- Tipagem forte com POCOs (Plain Old CLR Objects)
- Integração com Clean Architecture e DDD
📦 Instalando o Driver MongoDB
Crie um projeto com o template Web API:
dotnet new webapi -n ProjetoMongoDotnet
cd ProjetoMongoDotnet
Adicione o pacote oficial:
dotnet add package MongoDB.Driver
🧩 Estrutura Sugerida
ProjetoMongoDotnet/
│
├── Controllers/
│ └── ProdutoController.cs
├── Models/
│ └── Produto.cs
├── Repositories/
│ ├── IProdutoRepository.cs
│ └── ProdutoRepository.cs
├── Services/
│ └── ProdutoService.cs
├── appsettings.json
└── Program.cs
🧪 Modelo de Documento
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace ProjetoMongoDotnet.Models;
public class Produto
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; }
[BsonElement("nome")]
public string Nome { get; set; } = string.Empty;
[BsonElement("preco")]
public decimal Preco { get; set; }
[BsonElement("categoria")]
public string Categoria { get; set; } = string.Empty;
}
🗂️ Configuração em appsettings.json
{
"MongoDB": {
"ConnectionString": "mongodb://localhost:27017",
"Database": "LojaVirtual",
"Collection": "Produtos"
}
}
🔌 Injetando MongoDB via DI
builder.Services.Configure<MongoSettings>(
builder.Configuration.GetSection("MongoDB"));
builder.Services.AddSingleton<IMongoClient>(
s => new MongoClient(builder.Configuration["MongoDB:ConnectionString"]));
builder.Services.AddScoped<IProdutoRepository, ProdutoRepository>();
builder.Services.AddScoped<ProdutoService>();
🧠 Repositório com Acesso ao Mongo
public class ProdutoRepository : IProdutoRepository
{
private readonly IMongoCollection<Produto> _produtos;
public ProdutoRepository(IConfiguration config, IMongoClient client)
{
var database = client.GetDatabase(config["MongoDB:Database"]);
_produtos = database.GetCollection<Produto>(config["MongoDB:Collection"]);
}
public async Task<List<Produto>> ObterTodosAsync()
=> await _produtos.Find(_ => true).ToListAsync();
public async Task<Produto?> ObterPorIdAsync(string id)
=> await _produtos.Find(p => p.Id == id).FirstOrDefaultAsync();
public async Task CriarAsync(Produto produto)
=> await _produtos.InsertOneAsync(produto);
}
🎯 Controller Exemplo
[ApiController]
[Route("api/[controller]")]
public class ProdutoController : ControllerBase
{
private readonly ProdutoService _produtoService;
public ProdutoController(ProdutoService produtoService)
{
_produtoService = produtoService;
}
[HttpGet]
public async Task<IActionResult> Get()
=> Ok(await _produtoService.ObterTodos());
[HttpGet("{id}")]
public async Task<IActionResult> Get(string id)
=> Ok(await _produtoService.ObterPorId(id));
[HttpPost]
public async Task<IActionResult> Post([FromBody] Produto produto)
{
await _produtoService.Criar(produto);
return CreatedAtAction(nameof(Get), new { id = produto.Id }, produto);
}
}
✨ Vantagens do Modelo Moderno
-
Imutabilidade com
record
em modelos - Testabilidade com injeção de dependência
- Performance com chamadas assíncronas
- Modularização seguindo princípios SOLID e DDD
✅ Testes Unitários
Utilize xUnit ou NUnit para testar repositórios e serviços isoladamente com Mongo2Go
ou MongoMemoryServer
.
📈 Monitoramento e Logs
Integre com OpenTelemetry, Serilog ou Elastic APM para rastrear queries, latência e performance do MongoDB no pipeline .NET.
🛡️ Segurança e Produção
- Configure autenticação no cluster MongoDB
- Use conexões TLS (SSL) criptografadas
- Armazene secrets no Azure Key Vault, AWS Secrets Manager ou User Secrets
🔮 Futuro com C# 13 e MongoDB
Com recursos como default interface members, primary constructors e enhanced pattern matching previstos em versões futuras do C#, a integração com MongoDB tende a ser ainda mais expressiva, enxuta e robusta.
🤝 Conecte-se Comigo
Estou sempre aberto a trocar ideias e aprender com a comunidade. Se você também está explorando o C# 13 ou outras tecnologias, vamos nos conectar: