4

我正在尝试将一个相当复杂的类库作为服务公开,我认为 WCF,但是非常环保,并且正在努力理解我在架构上能做什么和不能做什么。如果我的客户也是 .NET(比如说 WinForms、WPF 和/或 ASP.NET MVC3),那么编写一堆合同来重新公开公共类或序列化复杂对象似乎有点过头了。从那里的许多教程中很难知道,因为其中很多只适用于值/原始类型。

WCF是要走的路吗?如果是这样,如果类库将管理数据的所有方面并且只公开对象,那么哪种风格最容易实现?

一个简单的类比:一个HumanBody需要作为服务公开的类,允许多个用户,永远在线等。如果我有一个 .NET Applause 客户端,我想做类似的事情

ServiceName.HumanBody myBody = new HumanBody();
myBody.Parts.Hands.Clap();  

我必须将这些对象转换为接口并编写一堆包装器方法,但这些对象是“完整的”,因为它们存在——这就是为什么我觉得它有点矫枉过正。(我知道我没有正确考虑这个问题——这就是问题的原因。如果这些问题太模糊,我会改进评论/答案。)

(另外,请注意,我并不是在问如何实际完成这个问题——这个问题已经有很多版本了,这里这里有几个值得注意的好答案。还有一个非常有用的教程关于如何构建你自己的WCF 架构,这里没有 VS 自动添加的混乱。我正在自己完成构建。)

4

2 回答 2

3

WCF 很可能是最适合您的途径。但是,在您开始考虑如何处理它之前,我认为我们需要稍微澄清一下服务是什么。

一项服务,无论它使用何种传输层(HTTP、HTTPS、TCP、UDP、MSMQ、运营商 pidgeons 等),都只是一个带有参数的操作列表。就其本身而言,您不能将“HumanBody”类作为服务公开。服务不是面向对象的;它们非常像程序化编程。

当然,您可以将复杂的对象图作为参数发送,或者将它们作为服务操作的返回值返回。您还可以编写您的客户端库,使您的服务接口是面向对象的,但您的实际服务命令不会这样。

要使用上面的示例,您可以将其作为服务接口:

public interface IHumanBodyService
{
    ClapHands(<parameters>);
}

<parameters>这里将是发送到服务所需的任何识别信息,以便它知道要做什么。这可能是整个myBody对象图(当然是序列化的,但只要你的类被正确注释,WCF 就会为你处理好),或者它可能是像 aBodyIdPersonIdvalue 这样简单的东西。

于 2012-04-20T14:31:36.220 回答
2

任何要在网络上运行的界面都应该尽可能地不说话。也就是说,它最好在网络上的一次往返中执行大多数操作。

您使用链接方法调用的示例是一个很好的面向对象的 API,但不幸的是,所有这些函数调用都非常健谈。要将其公开为良好的网络服务,必须将其包装在服务层中,该服务层包含客户端所需的每个基本功能的一种方法。必须将要传输的数据分组到数据传输对象中——只有属性而没有行为的类。

WCF 旨在支持这一设计原则。有一个仅操作服务合同接口和仅数据数据合同类。

我认为 WCF 是一个不错的选择,因为它可以帮助您将面向对象的设计包装在网络优化的服务层中。

于 2012-04-20T14:35:40.030 回答