【问题标题】:C#: Partial Classes & Web Services: Separating form and functionalityC#:部分类和 Web 服务:分离形式和功能
【发布时间】:2008-10-22 16:22:23
【问题描述】:
我正在涉足 Web 服务领域,并且一直在制作一个简单的 Web 服务来模拟数学运算。首先很简单,传入两个整数,然后根据调用的方法对它们应用二元运算符(加号、减号等)。
然后我决定让事情变得更复杂一些,并开始传递对象,但后来我发现 Web 服务只公开了类的数据方面,而不是功能方面。
有人告诉我,处理这个问题的一个好方法是让服务端的类成为一个部分类(类封装形式的这一端),而在客户端有另一个部分类(其中类封装了功能)。这似乎是一种优雅的做事方式..
所以,如上所述,我已经设置了两个类,但它似乎并没有像我所说的那样工作。
我正在尝试的可能吗?如果是这样,我哪里错了?
【问题讨论】:
标签:
c#
web-services
encapsulation
partial-classes
【解决方案1】:
部分类实际上是一种将自动生成的代码与开发人员代码分开的工具。
一个很好的例子是 VS 中的 windows 窗体设计器,或者新的 DBML Linq DataContext 生成代码。
还有一个论点是将它们与 VSS 样式的源代码控制提供程序一起使用,其中任何时候只有一个用户可以编辑文件。
将它们用于功能的逻辑分离并不是一个好主意 - 该划分仅存在预编译。编译后,您只会得到一个类,但不是一个易于调试或跟踪内部操作的类。
您所描述的情况听起来非常适合使用 WCF 合同。在这种情况下,客户端和服务器都将共享一个接口(或多个接口)。
您的复杂代码会放在那里,并且可以单独进行单元测试 - 即在您连接的应用程序之外。然后,当发现错误时,您可以快速消除代码问题并转而调查与连接相关的问题。
【解决方案2】:
不适用于部分类。部分类是一种语法结构,它使您能够在不同的源文件中拥有类的不同部分。但是,partial 类的所有部分最终都会编译成同一个二进制文件。
您可以使用扩展方法向您的类添加表示数据协定的功能。
您还可以尝试在共享程序集中实现该类,并使用 svcutil.exe /reference 将其导入客户端代理,而不是在 Web 服务命名空间中使用全新的声明。
【解决方案3】:
正如 Franci 所说,它只是允许您将同一类的不同部分放入不同的文件中。
您应该如何构建事物实际上取决于您在做什么。如果我是你,我可能会有一个相当简单的数据承载类和一个可用于处理该数据的消费者。
使用共享程序集也是一个好主意。但是,如果您真的希望能够将代码从服务器发送到客户端,则 CSharpCodeProvider 可以工作。
【解决方案4】:
(这个线程可能已经死了,但是......)我正在考虑做一些类似的事情,但使用(在我的情况下)Windows 服务上的功能。
客户端程序和 Windows 服务都需要访问数据,但只有服务需要对数据进行实际操作;它们都包含在一个 dll 中,该 dll 包含一个包含合同数据成员的部分类,但是我收到一个错误,说这个部分类与我的服务上的部分类冲突,即使它们都在同一个命名空间中,而且目前,服务器的部分类为空。