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

时间:2014-10-02 14:42:19

标签: c# web-services wcf soap inversion-of-control

我一直在开发使用一些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。虽然这仍然可以投射但是我从这个IServiceOf_Service1获得的方法与实现它的服务中提供的方法不同,例如我在BeginAddEndAdd实现它的服务,我只有一个AddAsync方法。

所以,出于好奇,是否可以做这样的事情?

1 个答案:

答案 0 :(得分:1)

你不能使你的IService&lt; T&gt;遍历客户端,因为WSDL不支持。

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

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

    一个。直接调用它。这意味着您的客户将 阻止 当前线程。

    湾使用APM异步模型,它使用BeginXXX和EndXXX等方法,它们将通过网络从另一个线程发起实际的I / O请求, 不阻塞 线程就像上一个选项一样。

    ℃。使用TAP异步模型,该模型利用与XXXAsync等方法一起使用Tasks。

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