服务应该像控制器吗?

时间:2011-05-25 00:43:21

标签: php flex web-services soa amfphp

我已经用通常的MVC思维方式做了大量的(网络)开发,我认为这对我有用。

但是,我现在必须以我的前端必须以服务的形式访问服务器端功能的方式拆分我的应用程序。

由于我是创建服务的人,我认为我可以将服务视为控制器,而控制器又可以调用模型中的函数。

这是一个很好的方法吗?

谢谢

P.S。:有问题的服务器端技术是PHP,客户端是Adobe Flex(ActionScript)。

2 个答案:

答案 0 :(得分:4)

有很多不同的方法,我不能说它们中的任何一个都是错的。我想知道你目前的做法是什么;什么限制让你想要改变它。

您似乎建议的方法是创建一个facade,它位于模型(执行'重型后端提升'的AKA PHP代码)和视图(AKA Flex Front端)之间。我没有继承问题;特别是如果你已经实现了包含所有繁重的业务逻辑的后端。我认为这个外观层是一个服务层,并将其视为模型的一部分;不属于控制器。

尝试在Flex和某些后端之间创建模型 - 视图 - 控制器 - 服务(MVCS)架构时;我通常这样做:

视图以Flex Components的形式实现。

Controller实现为ActionScript类。从我的角度来看,控制器的主要目的是将对服务器的请求和数据混洗回视图。

服务层在服务器上实现;在你的情况下PHP。对于服务器端的每个服务,您可能在Flex中有一个并行服务类。

模型层具有执行相关业务逻辑的类;验证数据以将其保存到数据库以从数据库中检索数据,以及您需要的任何其他业务逻辑。通常作为模型的一部分,我有值对象类。值对象类通常在ActionScript中并行,用于在服务器端服务和客户端控制器之间传输数据。

所以,它有点像这样:

  1. 用户与视图交互
  2. 视图将事件调度到控制器
  3. 控制器远程调用服务器上的服务
  4. 服务调用模型获取数据
  5. 模型获取请求,执行适当的操作,创建值对象 - 或值对象数组 - 并将其返回给服务
  6. 服务将结果返回给客户端控制器
  7. Controller会更新视图
  8. 有很多框架可以帮助这个过程,特别是对于应用程序层之间的“封装”通信。

    在许多情况下; “在模型中应该进入什么/在视图中应该去哪些”之间的界限是模糊的。当我们开发Flex(或AJAX或Silverlight或任何智能客户端)应用程序时,我们通常希望拥有智能视图;因此,某些业务逻辑可能会作为视图的一部分实现。没关系;我们必须平衡应用程序的功能和“理想”的抽象情况。

    你的问题有点宽泛,但我希望这会有所帮助。我个人更喜欢对我的应用程序架构实用。有时我的服务类执行业务逻辑,例如数据解析。这取决于应用程序及其目标和客户端以及时间范围。

答案 1 :(得分:1)

如果您的目标是在将服务返回到想要使用它的应用程序之前处理服务中的数据,您可以考虑为您的服务创建decorator类。

这是一个关于检索帖子的服务的含义的小图: (我似乎不允许发布图片,所以我把它放在ImageShack上。)

PostService类包含RemoteObject的一个实例,基本上只是远程(php)服务的客户端存根。它会将ResultEvent或FaultEvent返回给onResult或onFault函数。

现在您可以创建一个实现相同接口的装饰器类。我将其命名为PostServiceDecorator,但您最好给它一个名称,让您了解它的确切处理方式。该类又包含PostService的实例。 PostService会将ResultEvent传递给PostServiceDecorator作为参数传递的函数,后者现在可以处理该事件并将post对象的ArrayCollection传递给它给出的onResult函数。

通过这种方式,您可以将事物分开:PostService除了检索原始数据外什么都不做,如果您不装饰它,仍然可以使用它。

我有一点需要注意:这不是正确意义上的装饰器模式,因为您不能在使用它的代码中将一个PostServiceDecorator替换为PostService。它们将不同的对象传递给回调,因此如果替换它们,代码中断。界面仅强制您实现两个类中的所有方法。