Model view controller 业务逻辑存在于模型中还是控制器中?

Model view controller 业务逻辑存在于模型中还是控制器中?,model-view-controller,mvvm,business-logic,Model View Controller,Mvvm,Business Logic,在阅读之后,我仍然不知道我想把计算折扣的代码放在哪里。我认为计算产品或服务的折扣价格肯定是业务逻辑的一部分,而不是应用程序路由或数据库交互的一部分。因此,我很难将我的业务逻辑放在哪里 范例 类模型 { 公共功能存储服务($options) { $serviceId=$options['service_id']; //模型从数据库中读取“行项” $service=$this->entityManager->find('Entity\ServiceLineItem',$serviceId); //使

在阅读之后,我仍然不知道我想把计算折扣的代码放在哪里。我认为计算产品或服务的折扣价格肯定是业务逻辑的一部分,而不是应用程序路由或数据库交互的一部分。因此,我很难将我的业务逻辑放在哪里

范例

类模型
{
公共功能存储服务($options)
{
$serviceId=$options['service_id'];
//模型从数据库中读取“行项”
$service=$this->entityManager->find('Entity\ServiceLineItem',$serviceId);
//使用数据计算折扣
//但是等等,模型不应该只做积垢吗?
//这个计算不应该在控制器中吗?
$折扣=($service->getUnitPrice()*0.25);
//添加行项目
$item=新的SalesItem();
$item->setDiscount($discount);
}
}
类控制器
{
函数save()
{
$this->model->saveService($options);
}
}
问题:

上面的
$discount
计算,它应该留在模型中,还是进入控制器?如果它进入控制器,控制器必须首先调用
$service
(通过模型),然后在控制器内计算
$discount
,然后将值发送回要保存的模型。这样做吗

我可能把模型和“存储”混淆了。我可能需要一个模型来处理业务逻辑,数据库/持久性存储应该是一个单独的层。

我使用MVC使用了一个名为“Yii framework”的框架,它在控制器中有一个名为beforeSave()的函数,用于在保存模型值之前更改模型值

遵循这一逻辑,最好的做法可能是在保存模型(在控制器中)之前对价格应用折扣。

我使用MVC使用了一个名为“Yii framework”的框架,它在控制器中有一个名为beforeSave()的函数,用于在保存模型值之前更改模型值


遵循此逻辑,最佳做法可能是在保存模型(在控制器中)之前对价格应用折扣。

关于如何将业务逻辑与数据分离的问题不容易回答。然而,Daniel Rocco构建了一个框架,如果不是针对这个特定的问题,您可能会发现它对构建一般的业务应用程序很有帮助。

关于如何将业务逻辑与数据分离的问题不容易回答。然而,Daniel Rocco构建了这样一个概念:如果不是针对这个特定的问题,您可能会发现它对构建一般的业务应用程序很有帮助。

回答这样的问题通常是自以为是的,或者可以说这真的取决于您的业务用例

首先,我感觉到您的
模型
服务
措辞有些混乱。
模型
应该是您的
域模型
服务
应该是
应用程序服务
,位于不同的类别或不同的层

从架构上考虑,您可以遵循一个相当简化的实现

即:

  • 您在域模型中实现了与模型当前状态相关的所有行为概念
  • 使用将从存储库中查询行项目的工厂
  • 对于大多数与您的模型无关的内容,请使用域服务,例如计算折扣(如果您需要可重用的逻辑,例如在更多的模型或服务中)。您不想用不相关的机制和依赖性污染您的域模型
  • 对于持久性,您最好使用不同的层,这样您就可以更好地分离大部分关注点,原因之一是可测试性,另一个原因是以后代码更改较少

  • 要通过长期维护代码来实现更干净的体系结构和更少的痛苦,请不要忘记思考设计模式如何帮助您针对给定的业务用例实现解决方案。

    回答这样的问题通常是自以为是的,或者说这真的取决于您的业务用例

    首先,我感觉到您的
    模型
    服务
    措辞有些混乱。
    模型
    应该是您的
    域模型
    服务
    应该是
    应用程序服务
    ,位于不同的类别或不同的层

    从架构上考虑,您可以遵循一个相当简化的实现

    即:

  • 您在域模型中实现了与模型当前状态相关的所有行为概念
  • 使用将从存储库中查询行项目的工厂
  • 对于大多数与您的模型无关的内容,请使用域服务,例如计算折扣(如果您需要可重用的逻辑,例如在更多的模型或服务中)。您不想用不相关的机制和依赖性污染您的域模型
  • 对于持久性,您最好使用不同的层,这样您就可以更好地分离大部分关注点,原因之一是可测试性,另一个原因是以后代码更改较少

  • 要通过长期维护代码来实现更干净的体系结构和更少的痛苦,请不要忘记考虑设计模式如何帮助您实现针对给定业务用例的解决方案。

    业务逻辑属于服务,因此您需要添加服务层

    业务逻辑往往跨越多个模型,这意味着它不属于任何单个模型。因此,不清楚应该将逻辑放在哪个模型中

    输入服务类。 我倾向于为每次使用都提供服务