2013-02-07 85 views
3

我正在研究MVC模式之后的Spring应用程序,并想知道什么被认为是制定可靠服务层的“最佳实践”。此问题的原因是以下示例情况:将数据传递到服务层的最佳实践

加载用于编辑用户信息的页面。提交此表单后,我将其所有数据都收集到一个特定的Command类中,该类仅包含随后的操作(更新用户)所需的数据。

我能想到的几种情况,现在这个信息传递给我服务层:

  • 传递命令本身:userService.save(命令);
  • 传递一个模型类,在controller中获取:userService.save(user);
  • 传递模型类和命令:userService.save(user,command);
  • 传递所有的参数分别:userService.save(command.getName(),...)

在我看来将命令传递类本身看起来像最优雅的解决方案,我可以先验证所有自动使用框架的值将它们传递给我的服务。我在这里担心的是,当我从另一个类(而不是通过我的表单/控制器)调用方法时,我可以用无效数据填充此命令对象,从而导致服务层可能出现错误。

你会推荐什么?为什么?

+0

或者服务层信任te层调用它,dosn't不验证命令,或者不信任它,并且应该验证它接收到的数据。你只需要清楚地定义每一层的责任。无论你做什么,你总能够传递无效的数据。进行测试以确保您不会。 –

回答

0

在他的MVC书中,迪诺埃斯波西托建议创建一个“工人”类,它需要并返回一个视图模型。控制器使用视图模型调用worker,然后根据需要委托worker。我没有在实践中使用它,但理论上它似乎是一个很好的解决方案。

1

看到你我有以下想法 传递命令本身:userService.save(command);

这可能不是一个古德主意,因为你的服务层是不必要的 依赖Command对象

Passing a model class, fetched in the controller: userService.save(user); 

我会投票给本上。服务层只有什么是真正应该 知道

Passing both a model class and the command: userService.save(user, command); 

号相同第一个选项

Passing all of the parameters individually: userService.save(command.getName(), ...) 

Hmmmm ...不知道...也许是一个维护未来的开销。

I think if you want to do the validation, Use validation util classes to do the validation 
    which can be used for both Service and UI layer. Here a lot validation can be centralized. 
0

使用Command对象会引起麻烦的任何选项。它打破了松耦合。现在您的服务层与服务层紧密结合。请不要这样做。(编辑:在我下面的答案,当我说表示层模型我说的是视图模型和服务层它是域模型) 发送您的模型对象看起来像一个不错的选择。但是,这取决于模型的创建方式。有时候,表示层需要一个不同的模型结构,而服务层需要一个moderatley /完全不同的结构。

如果两个图层都有不同的需求,则需要创建2个模型结构。当表示层发生变化时,这种服务层的模型结构不需要改变。这很重要,因为该服务可能有多个消费者,并且在表示层更改时可能无法更改。

如果它们没有不同的结构,我仍然会从服务层的角度创建它们,因为服务是真正的可重用组件。

0

在处理多层系统中的命令时要遵循的一个很好的模式是使用CommandBus服务将命令路由到其特定处理程序。这样,你可以将你的控制器与你的服务分开(同时与通用路由系统相连)。

commandBus.handle(command);

你必须做额外的工作在配置命令总线处理器,但它会在长期内支付当你将能够重复使用的路由信息​​:

commandBus.register(commandType, handlerService);

然后您可以移动commandBus服务中的命令验证(即使这将意味着对commandBus的一些担忧)

commandBus.registerValidator(commandType, validatorsCollection);

相关问题