【问题标题】:Common WCF Object Support Classes常见的 WCF 对象支持类
【发布时间】:2009-09-21 23:24:26
【问题描述】:
我很困惑如何添加/包含/引用涉及 WCF 的服务器和客户端项目所需的一组支持类。
在我的 C# 解决方案中,我有:
- 一个服务器项目做服务器类型的东西
- 做 gui 类型的东西的客户项目
- 包含网络传递数据对象的类定义的 WCF 库
Server 项目使用普通引用来包含 WCF 库。客户端项目使用对 WCF 库的服务引用。
我的问题是我有几个实用程序类,它们在使用 WCF 库中包含的对象定义的服务器和客户端项目中都需要。我不想在服务器和客户端项目中放置这些类的两个(相同的)副本——我宁愿只保留一个副本。那建议使用类库,但是引用是如何工作的呢?这个新类库将具有对 WCF 库的标准引用,然后服务器和客户端项目都必须依次标准引用这个新类库。但是,客户项目现在不会有两个不同定义的 WCF 库中包含的数据对象类的定义吗?还应该如何包含这些实用程序类?
【问题讨论】:
标签:
c#
wcf
reference
structure
【解决方案1】:
使用服务引用方法可以消除使用 WCF 最初的一些麻烦,因为它会为您生成代码,从而简化您在早期 WCF 时代的生活。但是,随着您越来越习惯于使用 WCF 并意识到服务引用的实际作用,您开始意识到服务引用方法有时更多的是障碍而不是帮助。
例如,在我的例子中,我有一个由三个不同项目使用的 WCF 服务——两个 C# 项目和一个托管 C++ 项目。每次更新 WCF 服务接口时,我都必须在这三个项目中的每一个中重新生成服务引用。这很快让我头疼。
此外(您遇到了这个问题),服务引用方法仅处理您的 DataContract 类的结构,而不是它们的行为。因此,如果您在服务器端向 DataContract 类添加便利方法,则必须在客户端手动添加该行为,因为它不是通过元数据交换 (MEX) 操作传达的。
那时我偶然发现了这个video。在其中,Miguel Castro 提出了一个令人信服的案例来完全避免使用服务引用方法。当你检查他的论点时,它真的很有意义。
根据他的建议,我建议将您的 DataContract 类和对它们进行操作的类放在客户端和服务器都直接引用(无服务引用)的类库中。正如您将在视频中看到的那样,自己编写客户端代码并在 WCF 接口更改时更新它非常简单。
我已经使用这种方法几个月了,我发现这种解决方案对于我使用 WCF 的方式比使用服务引用方法要灵活得多。