我一直在开发使用一些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
获得的方法与实现它的服务中提供的方法不同,例如我在BeginAdd
和EndAdd
实现它的服务,我只有一个AddAsync
方法。
所以,出于好奇,是否可以做这样的事情?
答案 0 :(得分:1)
你不能使你的IService&lt; T&gt;遍历客户端,因为WSDL不支持。
但是,您可以执行以下操作:
您看到BeginAdd和EndAdd的原因只是 客户端 方面的技术性,它不会影响 任何内容 在服务器上发生。从您的帖子中,我认为您的Add操作返回一个Task,它是一个有效的WCF服务异步实现,从.net 4.5开始。即使你的操作返回一个Task,如果你要检查服务生成的WSDL,你会发现你的操作实际上返回了其他东西(int,或字符串,或者某些DataContract,具体取决于你的实现)。这是因为异步性只是服务的实现细节,并不会改变 合同 。客户可以通过三种不同的方式呼叫您的服务:
一个。直接调用它。这意味着您的客户将 阻止 当前线程。
湾使用APM异步模型,它使用BeginXXX和EndXXX等方法,它们将通过网络从另一个线程发起实际的I / O请求, 不阻塞 线程就像上一个选项一样。
℃。使用TAP异步模型,该模型利用与XXXAsync等方法一起使用Tasks。
您可以从visual studio中的“添加服务引用”窗口控制这些选项(a - c)和许多其他选项(例如,用于集合的集合类型?数组?列表?等等)。