WCF服务参考生成自己的合同接口,不会重用我的

Kie*_*one 39 c# wcf reference reusability

我的第一个问题是希望它是合适的:

共享接口程序集 - 我有一个'共享'程序集,它有一个接口,我们可以调用它IDocRepository.它标有,[ServiceContract]并有几个[OperationContract]标记的方法.

WCF实现程序集 - 我有两个WCF服务项目,每个项目都引用共享程序集,每个项目都将该接口实现为WCF服务.

消费者组装 - 最后,我有一个'客户'项目,也引用了共享程序集,并引用了两个WCF服务.

但是,使用者程序集中生成的服务引用来自自动生成的接口版本:

public partial class ExampleClient : System.ServiceModel.ClientBase<SomeNamespace.ExampleSvcRef.IDocRepository>, SomeNamespace.ExampleSvcRef.IDocRepository {
Run Code Online (Sandbox Code Playgroud)

我所期望的
我希望两个引用都会自动继承我定义的接口,消费者/客户端程序集也引用它.有点像它为参数和返回类型提供的类的重用,但对于服务接口.

为什么
我可以创建一个服务引用代理的实例并将其转换为我的接口类型.

所以我每次都可以手工修改生成的代码,但应该有更好的方法......?

(编辑:我在两个服务引用中都选择了"在引用的程序集中重用类型"和"在所有引用的程序集中重用类型"选项)

Qua*_*ter 46

"重用引用程序集中的类型"仅允许您重用数据合同,而不是服务合同.如果要共享服务合同,则根本不需要使用"添加服务引用".您可以直接使用ChannelFactory.

// Supply the binding and address in code
Binding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://tempuri.org/address");
IServiceContract channel = ChannelFactory<IServiceContract>.CreateChannel(binding, address);

// Or read them from the config file
ChannelFactory<IServiceContract> channelFactory = new ChannelFactory<IServiceContract>();
IServiceContract channel = channelFactory.CreateChannel();
Run Code Online (Sandbox Code Playgroud)

通道对象也将实现ICommunicationObject,因此如果需要调用Open()或Close()等方法,可以将其强制转换.

  • 没关系; 您需要将端点配置名称传递给ChannelFactory <>构造函数. (2认同)
  • 这样做的一些奖励是**你实际上看到了接口xml文档**(否则你没有,因为ServiceReference没有复制文档)你可以使用Resharper的Go to Implementation和Find如果您的服务项目在同一解决方案中,则引用. (2认同)