【发布时间】:2012-04-10 12:07:15
【问题描述】:
与我一起工作的团队(3 人)目前正在讨论一个新的中型 Web 应用程序的架构,您可以想象,团队内部对于应该如何设计应用程序存在不同的意见。我正在尝试做的是发布其中一些想法以及我们所知道的每种方法的优点/缺点,以便 SO 社区可以帮助我们走上最佳路线和/或达成妥协。
架构 A:
-
存储层:
对实体框架的调用
-
服务/业务层:
- 每个“经理”都有一个界面
- 每个“经理”有 2 个实现(1 个模拟/1 个实际)
- Manager 类中调用 Repository 然后应用业务逻辑的方法
- 每个方法都要进行单元测试
-
表示层(MVC):
- 通过某种服务定位器模式创建管理器
- 每个控制器都有针对它编写的单元测试
架构 B:
-
服务/业务层:
- 仅包含具体的“经理”类
- 方法直接调用实体框架(例如,我们将 EF 视为 repo)
- 可以使用接口,但仅限于需要不同实现的地方
- 在需要时进行单元测试
2。表示层(MVC):
- 直接创建管理器类
- 仅对脆弱或非常复杂的代码进行单元测试
你可以做出一些假设:
- 应用程序中的大多数方法都是数据库调用,具有奇数位的身份验证/根据用户权限/等返回的限制数据
- 95% 的控制器不包含明显的复杂性
- 没有业务需要换出或有业务层类的不同实现。万一我们不得不切换数据库等,业务部门很乐意接受重构的冲击
- 包括标记等在内的估计代码大小约为 50k 行(基于之前版本的网络应用,这是一团糟)
- 开发时间紧迫
- 有专门的 QA 人员
很抱歉,如果这看起来相反,但出于多种原因,我的首选架构实际上是 B。
我从事过抽象到 n 级的项目,对每一层进行更改、在 VS 中重建、修改测试/模拟方法等确实需要更长的时间,它提供对于本质上是简单的 CRUD 应用程序的项目来说回报并不多
企业并不关心应用是否拥有世界上最干净的架构,他们只想快速发布产品,没有太多错误
对于绝大多数方法(在所有层中),只需进行简单的功能测试即可。如果 GetProductById 方法不起作用,请修复它!在我看来,简单的方法不需要包含比被测试方法更多的代码行的单元测试方法。
我希望能够右键单击一个方法,选择“转到定义”并查看该实际方法源!我不想看到接口定义,然后不得不在其他地方查找实际方法。当然,如果一切都使用接口,那么交换到不同的数据库应该* 轻而易举,但实际上这不会发生,也不太可能发生在这个项目中。
总而言之,我并不反对接口或单元测试,但是其中任何一种似乎都在泛滥,而这几乎没有带来任何好处,我看不出重点。
有人有什么建议/意见吗?
【问题讨论】:
-
抱歉格式问题,我是在 iPad 上输入的!
标签: c# asp.net-mvc model-view-controller architecture