如何在不同的源/位置之间表示对象和映射

时间:2011-03-05 15:25:26

标签: php design-patterns architecture salesforce

我将构建一个系统,其中特定对象将来自Web服务(基于SOAP)。然后它将显示在网页上(通过PHP)。在某些情况下,我们会在本地MySQL数据库中存储一些附加信息的副本。从那里它将被批处理到Salesforce CRM(再次通过PHP)。我们也可能随后将该对象从Salesforce中拉出以在线显示。所以很多人继续。在大多数情况下,对象是相同的,系统中的每个后续节点可能会添加一些特定于它的字段,主要是唯一的ID。

我最初想到将所有必要的功能封装到PHP中的一个类中,这个类将处理来自每个适当源的读写。这感觉好像是让课堂变得复杂,而不是一个好的方法。

然后我看了一下只有一个容器类,除了getter和setter之外没有真正的功能。然后在此之外创建单独的功能来处理不同源之间的读取和写入,简单的代码虽然在不同来源的所有不同字段名称之间进行映射是繁琐的。这里可能有一两种设计模式,但我不熟悉它们。关于如何处理此问题的任何和所有建议都表示赞赏。

10 个答案:

答案 0 :(得分:3)

您所看到的是 Adapter 模式。您可以保留现有代码,直到完全更改所有类。

答案 1 :(得分:1)

我建议使用composite memento可序列化为XML。

答案 2 :(得分:0)

为什么不分开数据和操作?

将核心信息包含在班级C中。当Web服务发送此类时,它包含在某个类W的对象中。 Web服务提取C并将其发送到持久层,该层创建并存储内部包含P的{​​{1}},等等。 类似于数据在TCP / IP堆栈上的流动方式......

答案 3 :(得分:0)

我在考虑它之后看到这个的方式几乎是一个类,可以使用你的对象然后序列化它。 我可能会使用这样的东西:

<?php

class MyObject
{
    protected $_data;

    public function __construct($serializedObject = null) {
        if(!is_null($serializedObject)) {
            $this->_data = json_decode($serializedObject);
        }
    }

    public function __get($key) {
        return $this->_data[$key];
    }
    /* setter and other things you need */

    public function encode() {
        return json_encode($this->_data);
    }    

    public function __toString() {
        return $this->encode();
    }
}

然后使用它将序列化传递给您的不同Web服务。 我认为JSON在这个方面做得很好,因为你可以在很多编程语言中快速地将它快速反序列化,并且它比XML轻得多。

答案 4 :(得分:0)

我认为他们可能有几种方法可以解决这个问题。 @EGL 2-101适配器的想法是一种方法。

基本上,你有几个来源,这在O.O.行话,是不同的对象。但是,你想要像对待一个对象一样对待。

您可能希望为每个源创建一个类,测试“连接”,就好像每个案例是您在哪里使用的唯一方式。当你有几个类时,尝试让所有类共享一些接口,方法或属性:

class AnyConnection 
{
    public function __construct() {
        // ...
    }

    public function read() {
        // ...
    }

} // class


class SOAPObject extends AnyConnection
{
    public function __construct() {
        // ...
    }

    public function read() {
        // ...
    }

} // class

class MYSQLObject extends AnyConnection
{
    public function __construct() {
        // ...
    }

    public function read() {
        // ...
    }

} // class

class SalesObject extends AnyConnection
{
    public function __construct() {
        // ...
    }

    public function read() {
        // ...
    }

} // class

稍后,使用单个类来包装所有这些源类。

class AnyObject extends AnyConnection
{
    $mySOAPObject;
    $myMYSQLObject;
    $mySalesObject;

    public function __construct() {
        // ...
    }

    public function read() {
        // ...
    }

} // class

稍后,添加代码,以选择您想要的“连接”。

答案 5 :(得分:0)

DataMapper模式是您正在寻找的。

您可以为您使用的每个存储机制创建一个映射器,并将它们全部用于表示业务逻辑数据的一个对象。

答案 6 :(得分:0)

似乎您的问题更多的是纯粹的实现细节的架构/设计决策。 (我很长一段时间没有完成PHP,也不了解salesforce而是其他CRM系统)

我相信适合您的技术/模式是使用临时区域。这有助于特别是如果您有不断变化的集成需求,以及源数据与系统模型不同或者有不同的源集成时。因此,您导入到临时区域,然后从暂存进入系统。在每个地方,您自然必须映射(可以使用元数据)并可能转换/转换数据。将会有最初的努力来构建它,但是一旦完成,从升级到系统的步骤将保持静态/稳定。

使用元数据映射可以解决灵活性问题,但在实现上增加了一些复杂性。这一切都取决于您的项目所掌握的技能和时间。

答案 7 :(得分:0)

我根本不会在对象之间有任何关联。它们用于不同的目的,但看起来很相似。周期。

在.NET中,我们使用名为automapper的库来复制不同类之间的信息(如业务对象和DTO)。您可以使用get_object_varsreflection API在PHP中构建类似的内容。

myCopyApi.copy($myDTO, $myBO);

答案 8 :(得分:0)

假设您从网络服务中检索汽车。您可以将它存储在WebserviceCar中,该WebserviceCar具有属性汽车。

现在,如果您想将该Car存储在数据库中,请将其放在DatabaseCar中,该DatabaseCar也有一个属性汽车。如果要将其放在Salesforce中,请将其放在具有属性汽车的SalesforceCar对象中。

这样,您就有一个具有公共字段的对象和几个具有存储特定信息的对象。

答案 9 :(得分:0)

假设您正在考虑将实际对象(序列化,编码或其他)存储在数据库的字段中:从我的角度来看,对象在两个应用程序中从不相同,因为在业务方面,它提供服务不同的目的。在没有“缩短”空间的情况下,这样做是一种“缩短”。 请记住,主要表示一个“对象类别”,它们共享相同的属性和行为。因此,让每个应用程序使用它自己的类,因为它们的目的需要它。可以创建的内容,正如其他人建议的那样,并且正如您所想的那样,可以在所有隐含应用程序中使用适配器或工厂的创建,因为它为对象提供相同的业务目的“翻译”。

Adapter pattern

Factory pattern