繁体   English   中英

通过依赖注入来消耗SOAP服务

[英]Consuming SOAP service by dependency injection

我一直在开发使用一些WCF服务的Silveright应用程序。 在WCF中,我有几种不同的服务实现了相同的接口,例如:

public class Service1 : IService<Type1> {...}
public class Service2 : IService<Type2> {...}

我一直在考虑从客户端应用程序(消费者)访问IService接口,以开发通用类,以最大程度地重复使用代码以使用WCF服务,例如:

public class MyUnitedOPs<T>  {

      ServiceReference.IService<T> _object;
      public MyUnitedOPs (ServiceReference.IService<T> _object) {
          this._object = _object;
      }
}

但是,显然我无法直接访问IService接口,例如,它被称为IServiceOf_Service1 尽管仍然可以BeginAdd ,但是我从此IServiceOf_Service1获得的方法与实现它的服务中提供的方法不同,例如,在实现它的服务中我具有BeginAddEndAdd而我只有一个AddAsync方法。

因此,出于好奇,是否有可能做这样的事情?

您不能使IService <T>遍历客户端,因为WSDL不支持此功能。

但是,您可以执行以下操作:

  1. 您可以在服务器端拥有通用服务合同。
  2. 您还可以在服务器端具有通用服务实现。 (您不必创建Service1和Service2,可以坚持使用Service <T>)
  3. 您可以托管通用服务的多个具体实例,每个实例具有不同的类型。
  4. 客户可以引用您的一项或多项托管服务,并且每一项都会产生具体的代理。
  5. 您看到BeginAdd和EndAdd的原因仅仅是客户端的技术问题,它不会影响服务器上发生的任何事情。 从您的帖子中,我认为您的Add操作返回一个Task,这是从.net 4.5开始的WCF服务的高效异步实现。 即使您的操作返回了Task,但如果您检查服务生成的WSDL,您也会看到您的操作实际上还返回了其他内容(一个int或一个字符串,或者某个DataContract,具体取决于您的实现)。 这是因为异步只是服务的实现细节,它不会更改合同 客户可以通过三种不同的方式致电您的服务:

    一种。 只需直接调用即可。 这意味着您的客户端将阻止当前线程。

    b。 使用APM异步模型,该模型利用BeginXXX和EndXXX之类的方法,这些方法将从另一个线程通过网络发起实际的I / O请求, 不像以前的选项那样阻塞调用线程。

    C。 使用TAP异步模型,该模型将Tasks与XXXAsync等方法结合使用。

    您可以从Visual Studio的“添加服务引用”窗口中控制这些选项(a-c)以及许多其他选项(例如,用于集合的哪种集合类型?数组?列表?等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM