服务层和存储库

时间:2008-11-28 15:06:26

标签: c# model-view-controller repository-pattern castle-monorail

我现在一直在使用MVC框架,我真的很喜欢这些问题是如何被分开的。我养成了让控制器完成相当多工作的坏习惯。所以我真的在寻找一些建议。

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

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

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

  1. 如果不需要对数据进行操作,控制器可以直接调用存储库,因此服务层不需要参与
  2. 一旦需要对数据(业务逻辑)进行任何工作,那么这应该在服务层完成,控制器将在需要时对服务层进行简单调用
  3. 一旦服务完成了它的业务逻辑,它就会根据需要使用存储库(如果数据需要保留)。
  4. 理想情况下,模特应该保持精益,理想情况下,行动只不过是DTO
  5. 数据验证将在模型中完成(使用MonoRail验证属性)。我很感激甚至没有人喜欢用很多属性污染他们的模型,但这是一个不同的讨论。我喜欢MonoRail的验证属性,可以在UI中自动进行jQuery验证。
  6. 我正试图将我的所有代码转换为单一责任原则,因此试图理清我的编码实践。

    由于

3 个答案:

答案 0 :(得分:25)

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

  1. 从控制器调用存储库没有错。只需确保控制器不包含业务逻辑。
  2. 该服务负责(某些)业务逻辑并使用其他服务来执行此操作。存储库是一种服务,从服务中调用它没有任何问题。
  3. 模型应该包含业务逻辑,实际上您应该首先尝试将其放入模型中。如果您需要外部数据来执行该业务逻辑(来自其他模型或存储库),那么您应该创建一个服务。
  4. 模型中的验证没有错。使用或不使用属性是一个品味的问题(如果你喜欢它,那么它是好的)。如果模型过于复杂,则将验证移到模型外部(创建一组外部规则)。
  5. 最重要的是,做正确的事(这通常是正确的答案)。

答案 1 :(得分:6)

This视频深入了解了如何组织您的asp.net MVC解决方案以及解决问题分离和更好的可测试性。希望它也能帮助别人。我从中学到了一些好东西。

答案 2 :(得分:5)

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