除了最简单的一次性应用程序之外,您应该在所有应用程序中都有一个业务层。我想说的是,表示与业务逻辑的分离比业务逻辑与数据访问的分离更重要(尽管你真的应该两者兼而有之)。
通常,当应用程序只做 CRUD 时,似乎不需要业务层。但是,在以下情况下,这会失败:
- 您需要更改应用程序的 UI 框架……而 UI 技术发展迅速
- 您需要将业务逻辑作为库公开给不同的客户端代码,或者通过 Web 服务删除客户端
- 您的应用程序增长......并获得更严格的业务规则
- 您想开始对业务逻辑进行单元测试
如果您将业务逻辑放入表示层/控制器中,那么您的业务逻辑将永远与您的表示层绑定。你基本上是在你正在编写的代码上设置了一个人为的生命周期,同时限制了它的可重用性。当您需要更改 UI 技术时,您将需要重新编写业务逻辑。
由于这个原因,有很多 VB6 应用程序不得不被放弃和重写:它们应该在 C++ COM 对象中编写它们的业务逻辑……它们可以从 .NET 中调用。这些相同的 VB6 程序员继续使用 VB.NET Winforms 并再次犯了同样的错误。
编辑:至于服务:在需要时编写服务层。服务层通常是位于业务层前面的薄层。它实际上是您的业务逻辑的客户端。通常它会有相同的接口。除非您需要通过网络公开您的逻辑,否则您不需要一个。我曾在坚持在他们的业务逻辑之前编写 WCF 层的团队工作过……然后无论如何都要在同一台机器上运行所有代码。浪费时间并减慢应用程序。