【问题标题】:How to avoid duplicating business logic across multiple different presentation layers如何避免跨多个不同表示层重复业务逻辑
【发布时间】:2013-12-21 17:20:00
【问题描述】:

我目前正在为多渠道商务系统设计架构,该系统将有多种不同的前端演示,这些演示针对设备和渠道(用户类型和位置)量身定制。我面临的挑战是如何最好地确保我们以减少前端表示层重复的方式开发核心商务平台。

以下是我们需要支持的不同前端演示层的示例:

  • 面向消费者的传统桌面网站
  • 针对消费者的移动优化网站
  • 面向消费者的原生移动应用程序 (iOS/Android)
  • 客户支持代表的客户支持中心网站
  • 基于店内信息亭的网站,供消费者在实体店购物
  • 其他(微型网站和其他利用各种技术,如 Angular、PHP、.NET 等)

现在,我了解了围绕分层架构(表示层、业务层、数据层)和常见设计模式的最佳实践,以解决单个应用程序中的前端挑战(例如 MVC、验证器、拦截器)。但是,这些原则都没有解释如何在哪里在面对支持时最好地封装您的演示特定业务逻辑多个前端。

那么,我的问题是在开发这样一个系统以确保每个前端应用程序不会重复前端业务逻辑时,应该遵循哪些好的做法和原则? p>

过去,我使用不同的方法开发了许多具有此类要求的应用程序……其中一些效果相当好,而另一些效果不太好。但每次我都觉得自己是在为一个常见问题发明一个解决方案,并且必须利用一些最佳实践和原则。

我所询问的具体挑战的简单示例

我们所有的前端应用程序都必须支持注册新客户帐户的功能。注册表将包含电子邮件、密码和客户地址信息(街道、城市、邮编等)等信息。提交表单后,在系统中创建帐户并将验证电子邮件发送给用户之前,需要进行某些琐碎和非琐碎的验证。例如:

  • 电子邮件地址模式验证规则
  • 确保系统中不存在电子邮件地址
  • 密码复杂性规则
  • 地址验证(通过第三方地址验证/标准化系统)

在大多数情况下,这些验证规则需要在所有前端系统中强制执行,尽管每个前端的注册流程可能略有不同,并且可能只包含字段的一个子集。那么,为前端提供 API 以使每个前端不重复正确验证和处理注册所需的各种步骤,有哪些好的做法呢?例如,如果我们决定更改密码复杂性规则或地址验证规则等 - 我们如何最好地设计系统,这样我们就不必使用这种新的验证逻辑更改所有各种前端应用程序。

需要明确的是,我并不关心将在所有前端共享的核心业务逻辑放在哪里(即帐户创建服务、地址验证服务、帐户查找服务等)。这些模式通常在博客、书籍和论坛中讨论。我的问题特别与通常与表示层紧密耦合的业务逻辑有关。一些问题总是浮现在我的脑海中。

  • 我们是否应该提供一个表示服务层来支持所有前端操作,包括表单验证和通过 Web 服务进行处理?还是每个前端都应该拥有自己的表示逻辑,因为“没有两个前端是一样的”?
  • 如果我们确实创建了一个表示服务层,我们如何提供解决每个前端细微差异的服务?我们是否为这些前端中的每一个提供不同的服务/端点,或者只是提供每个前端在调用我们的服务时传递的不同“上下文”?
  • 此表示服务层是否控制错误消息并将适当的上下文感知消息返回给每个前端,还是我们应该只传回错误代码并让前端拥有它?

【问题讨论】:

  • 很好的问题,我认为必须有一些重复。我正在做一个类似的项目,并且有很多重复。它不漂亮,但我们会处理它。

标签: design-patterns web-applications business-logic n-tier-architecture presentation-layer


【解决方案1】:

如果我正确理解了您的问题,我会这样做:

使用Strategy pattern 根据抽象实现每个表示。使用Factory 来实例化您的具体策略。使用 MVC 分隔您的层,并使用Observer 更新您的视图层中的策略。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    没有什么神奇的方法可以让您的所有前端都拥有一致的验证规则,尤其是当您混合使用不同的技术和环境(PHP、JS、本机应用程序)时。如果您的验证规则很复杂,那么实现它的代码总是很复杂。

    您可以做的是让您的验证成为核心功能。您可以摆脱表示层中的所有验证,并将其移至所有前端使用的公共应用层。这样,您的演示文稿将只有一个表单并将其发送到服务器以在用户填写表单时获取验证错误。这可以使用来自 Web 的 AJAX 或来自本机应用程序的 REST API 调用来完成。如果操作正确,用户体验不会受到影响。

    在这种情况下总是需要权衡:您将花费更少的时间来维护验证代码,但代价是响应速度和/或用户体验稍差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 2021-11-27
      • 2023-04-10
      • 2011-01-16
      • 2019-06-17
      • 1970-01-01
      • 2016-09-26
      • 2020-08-12
      相关资源
      最近更新 更多