47

我使用 MVC 框架已经有一段时间了,我真的很喜欢如何分离关注点。我养成了让控制器做大量工作的坏习惯。所以我真的在寻求一些建议。

当我第一次开始使用 MVC 时,我经常在数据库工作完成后让控制器对模型进行操作。我知道这很糟糕,所以将这项工作转移到模型中。但是我对此并不满意,因为我希望我的模型非常好学。

我做了一些阅读,我看到人们通过服务层来保持他们的控制器和模型的精简,我喜欢它的外观。

我只是想了解服务层和存储库应该如何协同工作。这是我的假设,请告诉我这是否是一种好的工作方式?

  1. 如果不需要对数据进行任何操作,控制器可以直接调用存储库,因此服务层不需要参与
  2. 一旦需要对数据(业务逻辑)进行任何工作,则应在服务层中完成,控制器将在需要时对服务层进行简单调用
  3. 一旦服务完成了它的业务逻辑,它将根据需要使用存储库(如果需要持久化数据)。
  4. 理想情况下,模型应该保持精简,理想情况下只是充当 DTO
  5. 数据验证将在模型内完成(使用 MonoRail 验证属性)。我很欣赏甚至没有人喜欢用很多属性污染他们的模型,但这是一个不同的讨论。我喜欢 MonoRail 的验证属性在 UI 中自动 jQuery 验证的好处。

我试图将我的所有代码都转向单一责任原则,因此试图整理我的编码实践。

谢谢

4

3 回答 3

26

首先,没有一套适用于所有情况的规则。您如何为应用程序建模很大程度上取决于项目的类型和复杂性。话虽如此,这里有一些想法:

  1. 从控制器调用存储库没有错。只要确保控制器不包含业务逻辑。
  2. 该服务负责(一些)业务逻辑并使用其他服务来完成。存储库是一种服务,从服务中调用它并没有错。
  3. 模型应该包含业务逻辑,实际上您应该始终尝试将其放在模型中。如果您需要外部数据来执行该业务逻辑(来自另一个模型或来自存储库),那么您应该创建一个服务。
  4. 模型中的验证没有错。是否使用属性是一个品味问题(如果你喜欢它就很好)。如果太复杂,将验证移到模型之外(创建一组外部规则)。

最重要的是,做正确的事(这通常是正确的答案)。

于 2008-11-28T15:53:21.037 回答
7

视频对如何组织您的 asp.net MVC 解决方案和解决关注点分离以及更好的可测试性提供了深刻的见解。希望它也会对其他人有所帮助。我从中学到了一些好东西。

于 2012-10-01T21:31:14.473 回答
6

Ian Cooper 刚刚就这个主题写了一篇名为The Fat Controller的博文。

于 2008-12-04T14:57:45.653 回答