C# 架构模式:别让你的代码变成意大利面条
\n\n每位 C# 开发者迟早都会遇到项目开始像一盘煮过头的意大利面的时刻。500 行的方法、无所不知的类,以及比兔子繁殖还快的 bug。熟悉吗?是时候聊聊 C# 架构模式了。
\n\n在本文中,我们不会进行枯燥的讲解。我们将分析哪些 C# 架构模式 能真正拯救项目,展示 C# 代码示例,并给出清晰的选择标准。开始吧!
\n\nMVC 模式:永不褪色的经典
\n\nModel-View-Controller (MVC) 可以说是 Web 应用程序中最流行的 C# 架构模式。其主要思想是将职责分为三大支柱:数据 (Model)、显示 (View) 和控制逻辑 (Controller)。
\n\n实际中如何运作?
\n\n想象一个在线商店。用户点击“添加到购物车”按钮——这是给 Controller 的信号。Controller 请求 Model 更新数据。Model 说:“完成!”。Controller 选择合适的 View 并将最新数据发送给它。View 只是绘制它收到的内容。
\n\n以下是一个用于 ASP.NET Core MVC 的最小 C# 代码示例:
\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); // View 自行决定如何渲染列表\n }\n}\n\n何时使用: 具有丰富 UI 的 Web 应用程序,需要清晰分离逻辑和表示。非常适合基于 ASP.NET Core 的 C# 应用程序架构。
\n\nMVP 模式:适用于熟悉 Windows Forms 的开发者
\n\nModel-View-Presenter (MVP) 是 MVC 的“老大哥”,特别适合 WinForms 或 WPF 的桌面应用程序。主要区别:View 是一个被动的“傀儡”,而 Presenter 管理整个过程。
\n\nWinForms 示例
\n\n// View 接口(被动)\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(主动指挥者)\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 // 跳转到主窗体\n }\n else\n {\n _view.ShowError("用户名或密码错误");\n }\n }\n}\n\n优点: View 可以通过替换为 mock 对象轻松测试。 缺点: 代码量增加,但变得可预测。
\n\nRepository 模式:隐藏数据库的复杂性
\n\nC# Repository 模式 是业务逻辑与数据存储之间的中间层。您无需在整个代码中散布 SQL 查询,而是创建一个用于处理实体的统一“仓库”。
\n\nEntity Framework Core 示例
\n\npublic interface IProductRepository\n{\n Task<Product> GetByIdAsync(int id);\n Task<IEnumerable<Product>> GetAllAsync()