2013-03-02 83 views
4

我使用的是VS2010和.NET 4.0。共享WCF服务和客户端之间的接口(标有w/ServiceContract)

我已经在这里检查过(Sharing Interfaces that are implemented in WCF Service),但它的不同之处在于我试图完成的操作涉及一个接口,其标记为ServiceContract的

I.e.在服务中,我有一个接口A(标记为ServiceContract)和一个扩展接口B(也标记为ServiceContract)。 B由WCF服务实现。

确切扩展沿此线前进:

public interface A<T> 

public interface B : A<SpecificType> 

(“SpecificType”被标记为DataContract)

显然,B暴露在WCF客户端在代理生成的处理;然而,我还需要公开接口A(我正在实现一个半通用的发布/订阅系统,“发布者”需要能够检查/依赖接口A)。

我试图解决这个问题的第一种方法是创建一个单独的“共享”程序集,其中包含接口并可以被服务和客户端使用;然而,这最终不能很好地工作,因为在发布者中,它需要确保B的实例实际上从A正确扩展。这种隐式转换失败,可能是因为服务引用似乎并不完全与“共享”程序集合在一起。

为了解决这个问题,我手动编辑了Re​​ference.cs文件,它结束了工作(我添加了接口A的定义并确保接口B正确地引用了它)。但是这造成了一个很大的问题,因为每次我更新服务引用时,这些代码都会被清除。

看了看本网站和其他人的其他WCF回复,我似乎无法找到确切答案(也许我只是没有完成所有答案和答案)。

如果有人能指出我正确的方向,我会很感激。

谢谢。

回答

3

为客户端提供对'原始'服务契约接口的访问(汇编或链接到.cs文件)。然后你有两种选择:

1)将自动生成的代理调用包装到你自己的类方法调用中(实现所需的接口)。服务参考更新不会伤害你。

2)不要使用自动生成的代理。创建您自己的代理(实现您的接口):

var baseAddress = "net.tcp://localhost:4503/MyService"; 
var channelFactory = new DuplexChannelFactory<IMyService>(new InstanceContext(new MyNotificationReceiver()), //MyNotificationReceiver - WCF callback implementation class 
    myNetTcpBinding, 
    new EndpointAddress(baseAddress)); 

var proxy = channelFactory.CreateChannel(); 
proxy.MyMethod(); 
+0

建议2是正确的方法。如果我控制客户端和服务器,我从不使用服务引用/自动生成代理 – 2013-03-03 21:11:56

+0

有趣。因此,对于#2,如果我需要对服务的接口进行更改,那意味着我必须将接口的更改复制/复制到客户端?如果是这样,这似乎是一个很好的方式来引入潜在的错误/错误。但是,如果这是做到这一点的唯一方法,那么如果我想完成我所追求的目标,我想我没有多少选择。这些是唯一的选择吗? (虽然,很清楚,我非常感谢关于此的讨论/建议。) – BtySgtMajor 2013-03-04 03:09:02

+0

我认为检查/依赖服务接口/类型层次结构不是SOA的良好实践,因为WCF服务应该可以互操作。所以我认为你可能需要为你的服务引入一些特殊的“检查/获取/验证目的”接口/方法。但依靠客户端基本上是正确的。 – SalientBrain 2013-03-04 06:21:31

相关问题