Padrões Arquiteturais em C#: não deixe seu código virar um espaguete
\n\nTodo desenvolvedor C# mais cedo ou mais tarde se depara com o momento em que seu projeto começa a se parecer com um prato de macarrão cozido demais. Métodos com 500 linhas, classes que "sabem tudo" e bugs que se multiplicam mais rápido que coelhos. Familiar? Está na hora de falarmos sobre padrões arquiteturais em C#.
\n\nNeste artigo, não vamos dar palestras chatas. Vamos analisar quais padrões arquiteturais C# realmente salvam projetos, mostrar exemplos de código C# e dar critérios claros de escolha. Vamos nessa!
\n\nPadrão MVC: um clássico que nunca envelhece
\n\nModel-View-Controller (MVC) é, provavelmente, o padrão arquitetural em C# mais popular para aplicações web. Sua ideia principal é dividir a responsabilidade em três pilares: dados (Model), exibição (View) e lógica de controle (Controller).
\n\nComo funciona na prática?
\n\nImagine uma loja online. O usuário clicou no botão "Adicionar ao carrinho" — isso é um sinal para o Controller. O Controller pede ao Model para atualizar os dados. O Model diz: "Pronto!". O Controller escolhe uma View adequada e envia os dados atualizados para ela. A View simplesmente desenha o que recebeu.
\n\nAqui está um exemplo de código C# mínimo para ASP.NET Core MVC:
\n\n// Model\npublic class Product\n{\n public int Id { get; set; }\n public string Name { get; set; }\n public decimal Price { get; set; }\n}\n\n// Controller\npublic class ProductController : Controller\n{\n private readonly AppDbContext _context;\n\n public ProductController(AppDbContext context)\n {\n _context = context;\n }\n\n public IActionResult Index()\n {\n var products = _context.Products.ToList();\n return View(products); // A View decide como renderizar a lista\n }\n}\n\nQuando usar: aplicações web com UI rica, onde é necessário separar claramente a lógica da apresentação. Ideal para arquitetura de aplicações C# em ASP.NET Core.
\n\nPadrão MVP: para quem é amigo do Windows Forms
\n\nModel-View-Presenter (MVP) é o irmão mais velho do MVC, especialmente bom para aplicações desktop em WinForms ou WPF. A principal diferença: a View é um "boneco" passivo, e o Presenter gerencia todo o processo.
\n\nExemplo para WinForms
\n\n// Interface da View (passiva)\npublic interface ILoginView\n{\n string UserName { get; }\n string Password { get; }\n event EventHandler LoginClicked;\n void ShowError(string message);\n}\n\n// Presenter (regente ativo)\npublic class LoginPresenter\n{\n private readonly ILoginView _view;\n private readonly IAuthService _authService;\n\n public LoginPresenter(ILoginView view, IAuthService authService)\n {\n _view = view;\n _authService = authService;\n _view.LoginClicked += OnLoginClicked;\n }\n\n private void OnLoginClicked(object sender, EventArgs e)\n {\n if (_authService.Authenticate(_view.UserName, _view.Password))\n {\n // Navegar para o formulário principal\n }\n else\n {\n _view.ShowError("Login ou senha inválidos");\n }\n }\n}\n\nVantagem: a View pode ser facilmente testada, substituindo-a por um objeto mock. Desvantagem: a quantidade de código aumenta, mas ele se torna previsível.
\n\nPadrão Repository: escondendo a complexidade do banco de dados
\n\nPadrão Repository C# é uma camada entre a lógica de negócios e o armazenamento de dados. Em vez de espalhar consultas SQL por todo o código, você cria um "repositório" único para trabalhar com as entidades.
\n\nExemplo com Entity Framework Core
\n\npublic interface IProductRepository\n{\n Task<Product> GetByIdAsync(int id);\n Task<IEnumerable<Product>> GetAllAsync()