通过依赖项注入使用SOAP服务

本文关键字:SOAP 服务 注入 依赖 | 更新日期: 2023-09-27 18:25:30

我一直在开发silverlight应用程序,它使用一些WCF服务。在我的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。虽然这仍然可以强制转换,但我从IServiceOf_Service1中获得的方法与实现它的服务中提供的方法不同——例如,我有BeginAddEndAdd,而在实现它的服务器中,我只有一个AddAsync方法。

那么,出于好奇,有可能做这样的事情吗?

通过依赖项注入使用SOAP服务

您无法使您的IService<T>遍历到客户端,因为WSDL不支持这样做。

然而,这里有一些你可以做的事情:

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

    a。直接打电话就行了。这意味着您的客户端将阻止当前线程。

    b。使用APM异步模型,它使用BeginXXX和EndXXX等方法,这些方法将通过网络从不同的线程启动实际的I/O请求,而不是像前面的选项一样阻塞调用线程。

    c。使用TAP异步模型,该模型使用具有XXXAsync等方法的Tasks。

    您可以从visual studio中的"添加服务引用"窗口控制这些选项(a-c)和许多其他选项(例如,集合使用什么集合类型?数组?列表?等等)。