【问题标题】:WCF service contracts designsWCF 服务合同设计
【发布时间】:2011-08-02 19:25:52
【问题描述】:

在业务应用程序中,创意是动态的,每天呈指数级增长。 并且没有这样的服务合同符合所有要求,也没有许多合同。 假设我们最终获得了 100 000 个合同,它们最终获得了 100 000 个端点。

有没有人遇到过WCF限制的这类问题? 还是 WCF 不是针对真正的业务应用程序,而是与业务应用程序的集成并暴露了一小部分数据交换?

有人可以提出一些想法吗?

问候

谢谢克里斯,

我也觉得难以置信,100K 表是虚构的,但近 2000 个表是正常的。

假设一个有 100K 表的应用程序,对于每个服务合同,它需要接收或返回一个可序列化的对象,在这种情况下它是一个表实体。 这意味着 10 万个表最终会产生 10 万个更少的服务合约,并且每个表都有一些基本实现,例如 findby 主键、返回某种数组或列表的查询方法以及用于更新/插入的写入方法。

在一个表之上,我们会有很多业务逻辑方法。例如,SalesOrderTable 也会有诸如 create from qoute 等方法,可用于 promise、total、discount、tax...等

如果没有很多合同接口/端点,您将如何拥有可以向客户端提供此类信息的服务合同?

【问题讨论】:

  • 我很难相信你最终会获得数十万份合同/端点,除非你做的事情非常错误/奇怪......也许你可以提供一个例子。
  • 如果您最终拥有 100k 个端点,那么您就没有很好地考虑实现。您也没有考虑服务版本控制或弃用旧/未使用的服务。也许在一切都说完之后,你已经迭代了超过 100k 端点(仍然很难相信),但你不应该有那么多实际的端点。
  • 会好的。服务粒度通常定义了你有多少服务,我见过的大型应用程序的服务和数据合同远少于 100 个,即使是细粒度的服务也是如此。
  • 我没有示例应用程序,我仍在思考过程中,我无法确定有限数量的服务合同(每个合同建议 12 次操作)如何组合在一起。
  • 那么,您有 2K 表,对于您计划公开 CRUD 服务的每个表?您的客户真的需要这种级别的访问权限吗?是否可以将至少一些表映射到DataContract,而不是ServiceContract?然后向客户公开更高级别的功能?这应该会显着减少所需的服务/操作的数量。

标签: c# wcf


【解决方案1】:

您的问题有点抽象,所以可能更适合http://programmers.stackexchange.com,但我认为仍有一些问题需要弄清楚才能真正回答。

不清楚您所说的“WCF 不是用于真正的业务应用程序,而是用于与业务应用程序的集成”。当与您添加的一些 cmets 结合使用时,它看起来有点像您建议您在服务 + 数据库表或类之间进行 1:1 映射。目前尚不清楚业务逻辑方法,例如“从报价创建”是位于服务接口之后(因此业务逻辑在服务中),还是位于服务前面(即业务逻辑在客户端中)。

您似乎还担心目前看起来是虚假的要求(100k 表/服务),因为目前您似乎正在处理 2k 表...也不清楚您的一些想法在哪里来自,例如每个合约推荐的 12 次操作(您所指示的示例中的 ITradeService 有 19 次操作)。

WCF 是否能够扩展到 10 万个服务?是的,但是如果您尝试对具有 100k 个类或 100k 个表的系统进行建模,您将遇到类似的问题。您将希望以适当的方式对数据/逻辑进行分区,以便它们可以处理开销/要求,并且使用起来相对直观。这可能意味着您希望将服务分布在许多服务器上。

但是,正如我在 cmets 中所说,这对您来说似乎是一个非常奇怪的情况。如果您需要对 100k 服务建模,那么您要么试图通过服务公开太多,或者您有一个非常大的域要尝试建模。

一般来说,我希望服务处于比数据库模型更高的抽象级别。举个例子,我们以一个典型的客户模型为例……数据库可能由如下表组成:

  • 客户 – 核心客户详细信息,由 id 键入
  • 地址 - 代表邮政地址
  • 客户地址 - 在给定的时间段内将客户映射到地址
  • 电话号码 - 代表电话号码
  • 客户电话号码 - 在给定的时间段内将客户映射到电话号码,包括类型(手机、家庭等)
  • 等等……

您可以将每个表公开为来自服务的 CRUD 操作,但这似乎是个坏主意。然后,“注册客户”的逻辑可能位于客户端。他们必须以正确的顺序创建所有表条目以维护数据库的完整性。另一种方法是拥有一个包含操作“RegisterCustomer”的“客户”服务,该服务接受DataContract“NewCustomerData”,其中包括基本的客户详细信息、地址详细信息、电话号码详细信息等......只有一个操作是需要而不是许多来实现相同的结果,并且客户端交互更容易且不易出错。

不是一个完整的答案,但也许可以开始......您可能还想看看Principles of Service Design: Service Patterns and Anti-Patterns。虽然它有点旧,但它确实涵盖了一些有用的主题。我建议,在这一点上,您可能需要更多地考虑一下您想要实现的目标以及您如何看待您的模型,然后再提出更具体的问题。

【讨论】:

  • 非常感谢您对此的看法。在“Programming WCF services”一书第 827 页第 6 点中,它说“每个服务合同的成员不得超过 20 个。十二个可能是实际限制”。如果我们没有来自 WCF 服务的 CRUD 操作,我仍然很困惑,即使我们引入了一个中间数据类型“NewCustomerData”,正如你所建议的那样,CRUD 只减少了 4/5 倍。给定 2000 年的表格,我们将为大约 500 份合同进行人工编程。除此之外,还有许多智能业务逻辑适用于这些表。希望有更好的方法,而且看起来很费工。
  • 很难给你建议,因为你的问题很抽象。如此明显的问题包括:您想通过使用 Web 服务来实现什么目标?为什么您觉得需要公开所有表?客户有什么要求?如果您觉得工作量太大,有哪些替代方法可以减少工作量,但可以达到相同的目标?服务设计应该由您希望向客户提供的行为/功能驱动,而不是由您可以提供的内容驱动。
  • 我多年前开发了一个App,我想重写它,我在考虑C#和WCF......等等。为了更具体一点,我会想象一个 3 层应用程序、数据库层、应用程序服务器层和客户端 UI 层。客户端 UI 将连接到 AppServer,并且它不应该与 DB 有任何直接连接。 AppServer 将处理所有客户端请求。目前,我正在考虑在 AppServer 中使用 WCF 来处理所有请求,例如 CRUD、验证、业务规则和新的业务规则(即时),我还不知道如何做到这一点。在 nx 评论中继续..
  • 作为appServer向客户端提供服务,它会提供各种服务,不受定义的限制。正如我们看到的WCF发送或接收具有已知数据类型或预定义合约接口的数据,这意味着每次我们扩展数据库或扩展应用程序逻辑时,我们都必须添加新合约和新服务。与 CRUD 操作一样基本,每次我们添加新表以支持客户端 UI 时,我们的 AppServer 都会被修改/添加 - 正如有人所说 CRUD通过 WCF 是不好的,但我不知道如果它不在 AppServer 中会在哪里处理,引入 mid objs 只是更多的含义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多