[英]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
获得的方法与实现它的服务中提供的方法不同,例如,在实现它的服务中我具有BeginAdd
和EndAdd
而我只有一个AddAsync
方法。
因此,出于好奇,是否有可能做这样的事情?
您不能使IService <T>遍历客户端,因为WSDL不支持此功能。
但是,您可以执行以下操作:
您看到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.