【问题标题】:How should my MVC Model work with my Business logic classes?我的 MVC 模型应该如何与我的业务逻辑类一起使用?
【发布时间】:2009-07-06 16:08:28
【问题描述】:

所以我有一个 MVC 应用程序,而在另一个项目中,我有一个正常的类集合,用于处理应用程序的业务和数据逻辑。我在 MVC 项目本身的模型中也有一些逻辑。此逻辑处理 ViewModel 等,这些事情在 n 层项目中无法完成,因为它们与 MVC 项目本身相关并且需要在同一个项目中。

我的问题是:

  • 我的模型类是否应该了解 n 层业务逻辑?还是应该只有控制器具备这些知识并根据需要在 n 层应用程序和 MVC 模型之间来回发送数据?
  • 如果我的模型可以引用 n 层应用程序,那么我的控制器是否应该通过模型类访问 n 层?

希望这是有道理的,发现很难用正确的词来表达我的意思。

【问题讨论】:

    标签: asp.net-mvc model n-tier-architecture


    【解决方案1】:

    一般来说 - 你的模型类不应该有业务逻辑知识。他们应该只有向用户显示视图所需的信息(使用 mxmissile 建议的 DTO)。

    您的业务逻辑可以在您的控制器中,或者(更好)在您的控制器调用的单独服务层中。例如,在模型上使用绕过控制器并直接调用数据库的方法几乎总是一种不好的做法。

    这里的想法是使视图尽可能愚蠢。你向他们发送一个模型,他们提取他们需要的数据,适当地格式化并显示它。如果您决定要更改演示文稿,这使得以后创建相同数据的新视图变得更加容易。

    【讨论】:

    • 我在模型中确实有一些逻辑,所有这些都与准备数据以在视图中显示有关..
    • 所以大部分业务逻辑都在一个单独的项目中,我应该通过控制器而不是模型类来访问它吗?
    • @Damien - 如果模型中的逻辑都只是与显示相关(例如排序、格式化等),那应该没问题。尽管我通常会将该逻辑放在视图本身而不是模型中。这样,如果您有另一个具有不同格式要求的视图,则不必创建具有新格式逻辑的新模型。
    • 我不会将排序或格式化逻辑放在模型或视图中。在这种情况下,我使用 HtmlHelpers,它将模型保持为 DTO,并使视图保持哑。
    【解决方案2】:

    将模型视为控制器和视图之间数据的唯一容器。本质上是 DTO。

    【讨论】:

    • 那么模型也包含逻辑,不是吗?它们包含在控制器和视图之间保存数据的类,还包含对这些数据进行操作的方法和类?因此,我的 n 层项目在某种程度上是模型的扩展?
    • 阅读 Eric 在他的回答中的评论。他的观点在这种情况下是有效的。
    【解决方案3】:

    MVC 应用程序中的 ViewData/ViewModel 类可能包含模型类的实例(我的就是这样)。我的控制器调用我的业务服务并负责 ViewData 和模型之间的任何转换。

    如果我的模型可以参考 n 层应用程序,那么我应该 控制器通过模型访问 n 层 上课?

    我不会通过模型进入应用程序层,我会让控制器成为接口组件。控制器调用您的应用程序层,从您的数据访问组件返回您的模型实例。然后,您可以使用 ViewData/ViewModel 对象将这些实例转换为更多可使用的对象。您可以在控制器中执行此操作,或使用单独的汇编程序类。

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多