2

我有一堆来自客户的 WSDL,描述了我必须在我的应用程序中使用的 Web 服务。

有一个用于创建项目的 Web 服务,一个用于查询它们,一个用于更新它们。这些 WSDL 有很多重叠之处。我必须创建、查询和更新的项目以相同的方式出现在所有三个 WSDL 中。

当我使用 svcutil 时,我可以为三个 WSDL 生成代理,但随后每个代理都会重新定义这些项目。所以我有相同的类,三次,只是在不同的命名空间中。

使用它迫使我复制大量代码(例如,必须以完全相同的方式为每个代理映射一个代理类上的域对象)。

我能想到的唯一解决方案是手动编辑代理并消除重叠。但是,我认为当我重新生成代理时,这将使管理 Web 界面中的更改变得困难。

我想知道是否有可能一次性生成所有代理。

提前致谢。

4

1 回答 1

1

您可能会考虑编写一个程序来解析所有客户 WSDL 并将操作等存储在某种映射(或多映射)中。然后遍历地图并删除重复项并将结果写入另一个,最终的 WSDL 和代码生成。不过,您必须对命名空间做一些事情。

不过需要考虑的一点是:这样做所需的代码是否会超过您已经复制的额外代码?

另一种选择可能是为重复操作定义一个代理类。您必须通过使用命名空间添加操作来初始化它(创建命名空间字符串映射到操作映射,它本身就是映射到要执行的代码/对象的操作字符串)。然后每次要执行特定操作时,传入命名空间字符串进行操作。

想象一下,我们在命名空间 ns1、ns2 和 ns3 中定义了 Op1,在 ns1 和 ns2 中定义了 Op2。那么伪代码(强烈偏向 C++)可能是这样的:

class ProxyOperations
{
    addOperation(string opName, string namespace, OperationBase op);
    // You'll have to figure out what to do with the operation parameters,
    // maybe wrap them in a parameter context
    void doOperation(string opName, string namespace) {
        // lookup operation object and execute it
    }
    typedef map<string, OperationsBase> OperMap;
    typedef map<string, operMap> NamespaceMap;
    NamespaceMap namespaceOperationMap_;
};

{
    ProxyOperations po;

    // Populate it
    po.addOperation("Op1", "ns1", oper1ObjectNs1);
    po.addOperation("Op1", "ns2", oper1ObjectNs2);
    po.addOperation("Op1", "ns3", oper1ObjectNs3);

    po.addOperation("Op2", "ns1", oper2ObjectNs1);
    po.addOperation("Op2", "ns2", oper2ObjectNs2);

    // now use it
    po.doOperation("Op1", "ns2");
}
于 2012-06-05T10:21:53.810 回答