2

我刚刚开始学习 WCF,而且我完全没有网络背景。

我已经构建了一个 3 层桌面应用程序,它编译成一个本地运行的 exe。

现在我想将整个业务逻辑层移动到一个中心服务器,并使 GUI 成为客户端应用程序。

据我了解,WCF 应该是我的解决方案,事实上,它帮助我实现了我想要的。

我设法运行远程功能,这是我需要的基础。

我现在的问题是我不太了解架构

例如,我的一项服务从我的业务逻辑层返回一个数据类型(类)。

此类通过 WCF 机制自动对客户端可用。

但问题是,这个类包含一些我绝对不想暴露给客户的方法。

例如 Save 方法(保存到数据库)。

此外,有时我什至不想让客户端更改类的所有属性,因为此类可能会发送到我的服务之一。

我不想重新验证服务中的类实例。

我该怎么办?我是否应该构建另一层、受限版本的业务逻辑,并将其公开给客户端?或者有什么方法只向客户端公开我的类的一部分,而不限制它自己的服务器?

我知道这是一个基本问题,但老实说,在问这里之前我已经搜索了很多。我的问题是我不太清楚要搜索什么。

我的第二个问题是,你对任何可以解释我这个架构的资源有什么建议吗......?

4

3 回答 3

8

通常,如果您想封装您的业务层,您不希望直接公开业务对象。这是因为您现在有一个解耦客户端,并且您不一定希望每次业务逻辑/属性更改时都必须更新客户端。

这就是数据传输对象 (DTO)发挥作用的地方。通常,您希望控制您公开的合同(数据和方法)。因此,您将显式创建构成传输层的其他对象 (DTO)。然后,您可以安全地独立更改您的客户端和服务器代码(只要两者仍然履行合同对象)。

这通常需要更多的映射(在每一方发送或接收之前),但这通常是值得的。

对于 WCF,您的接口和类标记为[ServiceContract]以及您的类[DataContract]通常构成此传输层。

于 2012-08-11T15:56:08.980 回答
1

在 WCF 中,要向客户端公开方法,您必须使用 OperationContractAttribute 对其进行标记。因此,如果您不希望客户使用您的 Save 方法,请不要使用此属性对其进行标记。

更多信息在这里:http: //msdn.microsoft.com/en-us/library/system.servicemodel.servicecontractattribute.aspx

属性几乎相同,但属性不同:DataMemberAttribute。如果您不想让客户看到它,请不要用它标记它们(DataMember 属性

于 2012-08-11T15:03:23.793 回答
0

但问题是,这个类包含一些我绝对不想暴露给客户的方法。

你能提供你的类和接口代码的例子吗?如果是这样,我相信您可能会得到更具体的答案。

例如 Save 方法(保存到数据库)。

一种可能的方法是将您的班级分成2个班级。在第一个类中定义属性,然后将该类用作第二个类的基类。然后使用第二个类来定义方法。这将允许您只返回属性,同时让您的代码保持干燥。

此外,有时我什至不想让客户端更改类的所有属性,因为此类可能会发送到我的服务之一。我不想重新验证服务中的类实例。

虽然您可以为每个属性在 get 和 set 方法中定义逻辑,但我强烈建议您重新验证服务之间收到的任何输入,因为将来一项服务中的任何更改或错误都可能导致整个应用程序出现更大的问题。此外,这还有助于确保您的应用程序更安全地抵御任何潜在的攻击。

我是否应该构建另一层、受限版本的业务逻辑,并将其公开给客户端?或者有什么方法只向客户端公开我的类的一部分,而不限制它自己的服务器?

我同意上述答案,您应该能够使用接口中的数据和方法属性来限制对不同属性和方法的访问。

我的第二个问题是,你对任何可以解释我这个架构的资源有什么建议吗......?

如果您正在寻找廉价但非常有价值的基于视频的培训,我发现 Pluralsight 提供的课程对于架构和 WFC 服务都非常有用(顺便说一句,我与他们无关,只是喜欢他们的培训)。

于 2012-08-11T21:19:00.020 回答