.NET Moderno em Comunicação com MongoDB
Danilo O. Pinheiro, dopme.io

Danilo O. Pinheiro, dopme.io @daniloopinheiro

About: Inicie em tecnologia por volta de 2017. Neste percurso, com experiencia em desenvolvimento web em .NET e outras tecnologias. Com algumas certificações, e fundador da DevsFree.

Location:
Brasil
Joined:
Jul 22, 2020

.NET Moderno em Comunicação com MongoDB

Publish Date: Jun 13
0 0

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 ou Newtonsoft.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
Enter fullscreen mode Exit fullscreen mode

Adicione o pacote oficial:

dotnet add package MongoDB.Driver
Enter fullscreen mode Exit fullscreen mode

🧩 Estrutura Sugerida

ProjetoMongoDotnet/
│
├── Controllers/
│   └── ProdutoController.cs
├── Models/
│   └── Produto.cs
├── Repositories/
│   ├── IProdutoRepository.cs
│   └── ProdutoRepository.cs
├── Services/
│   └── ProdutoService.cs
├── appsettings.json
└── Program.cs
Enter fullscreen mode Exit fullscreen mode

🧪 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;
}
Enter fullscreen mode Exit fullscreen mode

🗂️ Configuração em appsettings.json

{
  "MongoDB": {
    "ConnectionString": "mongodb://localhost:27017",
    "Database": "LojaVirtual",
    "Collection": "Produtos"
  }
}
Enter fullscreen mode Exit fullscreen mode

🔌 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>();
Enter fullscreen mode Exit fullscreen mode

🧠 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);
}
Enter fullscreen mode Exit fullscreen mode

🎯 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);
    }
}
Enter fullscreen mode Exit fullscreen mode

✨ 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:

Comments 0 total

    Add comment