【问题标题】:Prevent WCF exposing my whole class?防止 WCF 暴露我的整个班级?
【发布时间】:2012-08-08 13:34:31
【问题描述】:

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

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

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

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

我可以运行远程功能,这是我需要的基本功能。

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我认为抽象数据传输对象层会更好。如果您需要从 wcf 切换,这是一种更灵活且更便携的方法。

标签: c# wcf architecture


【解决方案1】:

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

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

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

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

【讨论】:

  • [DataContract] 是您告诉 WCF 为公开的方法参数序列化/反序列化什么的方式。查看更多here
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2018-02-26
      • 2014-11-28
      • 1970-01-01
      • 2023-01-26
      • 2012-08-20
      相关资源
      最近更新 更多