SOA + MVC - 我应该在哪里填充实体的属性?

时间:2012-01-20 15:32:49

标签: model-view-controller language-agnostic soa

我正在开发一个大量使用服务的MVC应用程序。我的问题是,在创建实体时,我应该从控制器内部还是从服务中填充其属性?

示例1 - 从控制器内填充:

// MyController.php
function someAction() {
  $name = $_POST['name'];
  $gender = $_POST['gender'];

  $user = new User();
  $user->setName($name);
  $user->setGender($gender);

  $userService->createUser($user);
}

// UserService.php
function createUser($user) {
  $this->saveToDb($user);
}

示例2 - 从服务中填充:

// MyController.php
function someAction() {
  $name = $_POST['name'];
  $gender = $_POST['gender'];

  $userService->createUser($name, $gender);
}

// UserService.php
function createUser($name, $gender) {
  $user = new User();
  $user->setName($name);
  $user->setGender($gender);

  $this->saveToDb($user);
}

我更喜欢第二种方法,因为我觉得控制器应该简单地委托工作,服务层应该完成繁重的工作。

它似乎也遵循DRY原则,因为如果我有多个控制器需要创建User个对象,我将不会重复任何代码。编写单元测试也是如此 - 我可以简单地将所有参数传递给服务对象。

但我已经看到了第一种方法,我想知道它是否有一些我没有看到的优势。

1 个答案:

答案 0 :(得分:1)

我会采用第二种方法,因为它是DRY。

第一种方法是可以的,但是您应该使用DTO来代替数据库实体,您可以使用DTO来填充服务中的数据库实体。我不会从服务中公开数据库实体,以便将DB层与表示层分离。