【问题标题】:Where does business logic belong in the MVC pattern业务逻辑在 MVC 模式中属于哪里
【发布时间】:2012-06-27 18:27:39
【问题描述】:

假设我在数据库中有一个 person 表。每当一个新人被添加到数据库中时,都会生成一个 pdf 文件并通过电子邮件发送给某人。

这个逻辑是否进入模型,所以应用程序所做的只是传递数据以插入新人,模型还处理pdf和电子邮件?

或者这个逻辑会进入控制器吗?

如果这应该进入模型,并且我正在使用实体框架,我该怎么做?创建一个包装.edmx 模型的.cs 类?

【问题讨论】:

    标签: asp.net asp.net-mvc design-patterns edmx


    【解决方案1】:

    据我了解,您不会想用这种逻辑来搞砸控制器。属于控制器的东西将定义将传递给视图的模型或打开或关闭验证。控制器应该控制其他几个与视图相关的事情,但这只是几个。我试图提出的一般观点是,控制器负责通过调用服务或模拟存储库来填充模型,然后将这些模型传递给视图。

    按照您的解释,我将添加一个位于数据访问层之上的服务层(dal - 您的 EDMX 和存储库所在的位置)。在该服务层内部,我将调用方法或服务来生成 pdf 并发送电子邮件。

    存储库和数据访问层应该只关心查询数据库和检索记录。这与您使用什么 ORM 或数据访问工具无关。检索到的记录被传递到服务层,您可以在其中对数据执行操作(例如验证或发送 pdf),然后表示层返回它需要在视图中显示的任何格式的记录。控制器不对检索到的数据执行任何逻辑操作,而是将其交给视图。

    如果您想了解我所描述的架构布局的更多详细信息,那么我很乐意为您提供更深入的了解。

    【讨论】:

    • 感谢您的解释和帮助。还有一个关于逻辑应该去哪里的问题,答案可能只是服务层,但我想确定一下。假设在控制器中我想让一个 ID 为 10 的人传递给视图。我想从 person 表中获取数据库中的数据,但我也想从 API 调用中获取数据以完成模型的填充,比如说......今天的星座运势。那要去哪里?谢谢。
    • @user1308743 这将取决于您的 API 的功能。您有一个存储库或某种方法,它接受 personId = 10 并从 person 表中检索该记录。该记录以某种方式传递回控制器。从那里您通过视图模型将该人员记录传递给视图。然后在视图中,您的 API 组件应请求检索到的记录将提供的某种类型的参数,例如“astrological_sign”。该 API 会发出并获取该标志的星座并显示它。所以你不会在服务层这样做,因为它不是你的 API。
    • @user1308743 如果它是您的自定义 API,并且您将该星座数据存储在您的数据库中,那么它应该是一个后续服务调用,根据人员记录检索星座,然后将该星座数据分配给视图模型以及作为属性的人员详细信息。
    猜你喜欢
    • 2011-05-30
    • 2011-12-26
    • 2014-03-16
    • 1970-01-01
    • 2013-04-01
    • 2014-10-10
    • 2013-09-04
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多