ASP.NET Core MVC区域间通用功能:存根目录还是各区域复制?
ASP.NET Core MVC 区域通用功能的最佳实践
绝对不要复制相同的控制器和视图到每个区域——遵循DRY(Don't Repeat Yourself)原则,把通用功能放在根目录是更合理的选择,具体处理方式分以下几种情况:
通用控制器的处理
- 把跨区域复用的控制器放在根目录的
Controllers文件夹下。 - 可以通过路由配置确保区域内的请求能访问到根控制器,或者给控制器添加
[Route]特性指定通用路由,比如:
这样不管是[Route("[controller]/[action]")] public class CommonController : Controller { public IActionResult SharedAction() { // 通用逻辑 return View(); } }/Admin/Common/SharedAction还是/Customer/Common/SharedAction都能匹配到这个动作,区域内的视图也可以直接通过Url.Action("SharedAction", "Common")生成链接。
通用视图的处理
- 通用布局、部分视图、组件这类复用性高的视图,直接放在根目录的
Views/Shared文件夹下即可。ASP.NET Core MVC的视图查找机制会自动优先查找区域内的视图,找不到时会去根目录的Shared文件夹找,无需复制到每个区域。 - 如果是通用控制器对应的视图,放在根目录
Views/[ControllerName]下,区域内的控制器如果需要调用这个视图,可以直接指定路径:return View("~/Views/Common/SharedView.cshtml");
有细微差异的通用功能
如果通用功能在不同区域需要少量定制,但核心逻辑一致,别复制代码,用继承来处理:
- 根目录创建基类控制器,实现核心逻辑;区域内的控制器继承这个基类,只重写需要差异化的方法。
- 视图方面可以用布局继承,或者把通用部分抽成部分视图,区域视图只负责渲染差异化内容。
为什么不要复制?
- 复制代码会带来维护灾难:后续修改逻辑时,要同步改N份代码,很容易遗漏导致不一致。
- 违反DRY原则,平白增加项目复杂度和出错概率。
- 根目录存放通用功能完全符合ASP.NET Core MVC的设计约定,框架本身就支持区域访问根目录的控制器和视图。
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

