为连接第三方的服务选择正确的设计模式

时间:2014-10-23 12:59:24

标签: web-services symfony design-patterns soap

我想知道是否有人可以提供帮助,所以我需要找出正确的设计模式,我希望有人能指出我正确的方向。

所以基本上我使用symfony2,我使用一个包来处理我的soap请求到第三方api进行身份检查用户但是我需要构建服务,为soap请求构建xml并添加一些额外的东西到包含身份检查集合的用户实体。

我坚持如何正确构建服务,如何使服务第三方不可知?我是否可以创建服务接口,然后可以使用它来生成第三方特定服务?那么我是否构建了一个映射到第三方结果的实体,但这又是一个我为特定第三方扩展的接口吗?

必须有一个设计模式,但我不知道甚至谷歌或寻找什么。

提前致谢。

加成

我想也许我可以使用Bridge模式,但不是100%确定

1 个答案:

答案 0 :(得分:1)

我建议你实现一个Factory方法,让Symfony为你实例化正确的类(如here所述)。 像这个例子:

假设您有一个可以定义为接口的简单(外部)服务:

<?php

namespace Acme\DemoBundle\Service\Integration;


interface ExternalServiceInterface  {

    public function call($object)
}

定义这样的工厂:

<?php

namespace Acme\DemoBundle\Service\Integration;

class ESServiceFactory {

    /**
     * @var array of integration strategy
     * key   = strategy key name
     * value = service implements the behaviour
     */
    protected $services;

    function __construct($services)
    {
        $this->services=$services;
    }

    /**
     * @param $type: strategy key name
     * @return \Acme\DemoBundle\Service\Integration\ExternalServiceInterface;
     */
    public function get($type)
    {
        return $this->services[$type];
    }
} 

并将服务定义为:

services.yml

services:

# The real Soap Services
  acme.integration.soap:
        class: Acme\DemoBundle\Service\Integration\ExternalServiceSoapCaller
        arguments: [%acme.soap_base_url%, %acme.api_key%, @logger]

# Mocked service: response with fixed value (true). For tests pourpose
  acme.integration.es_a_true:
        class: Acme\DemoBundle\Service\Tests\ExternalServiceMock
        arguments: [true]

# Mocked service: response with fixed value (true). For tests pourpose
  acme.integration.es_false:
        class: Acme\DemoBundle\Service\Tests\ExternalServiceMock
        arguments: [false]


  sd_factory:
        class:            Acme\DemoBundle\Service\Integration\ESServiceFactory
        arguments:
          -service_available:
            'SOAP': @acme.integration.soap
            'MOCK_ALWAYS_TRUE': @acme.integration.es_a_true
            'MOCK_ALWAYS_FALSE': @acme.integration.es_a_false


  external_service_manager:
        class:            "Acme\DemoBundle\Service\Integration\ExternalServiceInterface"
        factory_service:  sd_factory
        factory_method:   get
        arguments: [%params_defined_in_parametes_yml%]

在实践中,您可以在参数中定义您想要的策略,例如&#39; SOAP&#39;或者是你的控制器/服务中的模拟回复:

$response = $this->get('external_service_manager')->call($obj);

希望得到这个帮助。