8

我正在使用 SOAP Web 服务。Web 服务为其每个客户指定一个单独的服务 URL。我不知道他们为什么这样做。它们的所有功能和参数在技术上都是相同的。但是,如果我想为每家公司的服务编写一个程序,我必须知道它是有意的。这意味着对于一家名为“apple”的公司,我必须使用以下 using 语句:

using DMDelivery.apple;

而另一个叫做“橙色”

using DMDelivery.orange;

但我希望我的程序适用于所有人,并将公司名称或服务参考点作为参数。

更新:如果我必须为每个客户编写一个单独的应用程序,那么我将不得不在每一个小改动时让所有这些应用程序相互更新,随着客户数量的增加,这将是一项低效的工作。

谁能想到解决方案?我会很感激的。

4

3 回答 3

3

如果您的所有服务都有一个基本合同(接口),您可以使用一种工厂来实例化您的具体服务,并且只在客户端代码(调用代码)中引用您的接口。

//service interface
public interface IFruitService{
  void SomeOperation();
}

//apple service
public class AppleService : IFruitService{
  public void SomeOperation(){
    //implementation
  }
}

例如有一种工厂类(你可以把你的using陈述放在这里)

public static class ServiceFactory{
  public static IFruitService CreateService(string kind){
    if(kind == "apple")
      return new AppleService();
    else if(kind == "orange")
      return new OrangeService();
    else
      return null;
  }
}

在您的调用代码中(您只需using为包含您的接口的命名空间添加一条语句):

string fruitKind = //get it from configuration
IFruitService service = ServiceFactory.CreateService( fruitKind );
service.SomeOperation();

您还可以使用依赖注入原则。

于 2013-05-06T10:02:31.333 回答
0

如果一切都相同,只是端点地址不同,也许您可​​以在调用 Web 服务方法之前尝试仅更改它。

MyWebServiceObject ws= new MyWebServiceObject();
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://www.blah.com/apple.asmx");
于 2013-05-06T07:57:48.707 回答
0
  1. 在您的实施中使用任何一个客户端。前任。苹果
  2. 编写消息检查器并将其附加到输出点
  3. 在消息检查器中,将类型的名称空间替换为适当的客户端名称空间。EX:在消息检查器之前:MyClinet.Apple.Type
    在消息检查器之后:MyClient.Orange.Type,如果提供者是橙色。
于 2013-05-06T09:33:58.137 回答