“使用”具有几乎相同功能的两个不同库

时间:2013-05-06 07:16:24

标签: c# .net web-services soap

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

using DMDelivery.apple;

而另一个名为“橙色”

using DMDelivery.orange;

但我希望我的程序能够为所有这些程序工作,并将公司名称或服务参考点作为参数。

更新:如果我必须为每个客户编写一个单独的应用程序,那么我将不得不保持所有这些应用程序的每次小更改都会更新,这将是一个低效的工作随着客户数量的增加。

有人能想到解决方案吗?我将不胜感激。

3 个答案:

答案 0 :(得分:3)

如果您拥有所有服务的基本合同(接口),则可以使用某种factory来实例化您的具体服务,并且只在您的客户端代码(调用代码)中引用您的接口。< / p>

//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();

您还可以使用Dependency Injection原则。

答案 1 :(得分:0)

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

MyWebServiceObject ws= new MyWebServiceObject();
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://www.blah.com/apple.asmx");

答案 2 :(得分:0)

  1. 在您的实施中使用任何一个客户端。恩。苹果
  2. 编写消息检查器并将其附加到出发点
  3. 在消息检查器中,使用适当的客户端名称空间替换该类型的名称空间。 EX: 在消息检查器之前:MyClinet.Apple.Type
    在Message Inspector:MyClient.Orange.Type之后,如果Provider是Orange。