【问题标题】:AngularJS Multi TenancyAngularJS 多租户
【发布时间】:2014-12-08 08:45:09
【问题描述】:

我正在一个小型团队工作,该团队设计一个流程管理系统,供同一行业内的多个不同客户使用。系统的目标和客户的高水平要求非常相似。然而,正如预期的那样——一旦我们开始深入挖掘他们的个人需求,我们最终会为每个客户进行一些相当广泛的定制,涉及几乎所有内容,包括数据、输入表单、验证、工作流、报告等。

将所有这些加起来,我们意识到多租户架构可能是实现这一目标的最佳方法。后端远远超出了设计范围,它是一个 .net 中的 RESTful api,由 ServiceStack、RavenDB 和 Sql Server 构建。任何熟悉 ServiceStack 的人都会知道它非常灵活,并且在构建时考虑了可插拔性——这使得实现多租户 REST api 比我们预期的要容易得多。我们使用一个非常简单的约定,通过检查会话中属于每个请求的值来识别和授权租户(所有“特定于租户的”请求都必须经过身份验证,以便始终有可用的会话)。因此,目前几乎不需要在任何路由 url 中跟踪或传递来自客户端的租户 ID。因此,对于后端 api,我们已经实现了我们的设计目标,即拥有一个支持不同客户的单一代码库,具有大量代码重用和根据需要自定义/扩展租户特定功能的灵活性。

因此,由于后端大部分都被摆平了,我们将注意力转移到前端,在前端,我们确实在努力在 AngularJS 中实现类似的多租户方法。部分问题在于我们对 Angular 比较陌生。我们有一些使用标准“文件夹模式”构建单一用途应用程序的经验,但是当我们在这里查看我们的多租户需求时,我们真的很难将所有内容(一般项目结构/路线/视图)联系在一起以支持相同的多租户- 我们通过后端实现的 AngularJS 中的租户设计目标(支持重用、灵活性和定制的单一代码库)。 module pattern 似乎是为每个租户“插入”自定义功能的一个很好的选择,但我们仍然缺少一个整体架构方法,它为我们提供了一个支持上述目标的单一 AngularJS 代码库。任何 AngularJS 专业人士都可以帮助我们克服困难并在这里推荐一种方法吗?

谢谢!

【问题讨论】:

  • 我相信你必须更具体一点,否则会因为“太宽泛”而被关闭。
  • 如果您刚刚为指令/模板/控制器/服务器创建完全独立的系统,则发布一些代码的小示例可能会有所帮助。然后答案将能够向您展示如何重构它们。
  • 同意上述观点,如果没有更多细节,真的很难提出一个方法,你的布局会改变吗?是否只是一些小的验证,是否在不知道租户之间发生什么变化的情况下使用 css 很难提出模式。

标签: angularjs multi-tenant


【解决方案1】:

这是一个设计问题,所以我的回答将是高水平的。

多租户客户端 Web 应用程序将具有以下变量,其中大部分您已经提到过。对于如何继续,您应该采取 2 种广泛的方法。

预先(尽可能多地)列出下面列出的每个变量的变化。

方法 a) 如果您认为跨租户变量的变化是 manageable,请创建 1 个处理所有租户的应用程序。 manageable 是什么?您可以按照下面的处理变量中的变化部分进行一项练习。看看你能不能通过metadata 开车。这可以通过了解每个变量在租户之间的变化来理解。

方法 b) 如果您认为变化太多,请重新考虑制作这些单独的应用程序。随着你的前进,你可能会发现一些共同点。您可以将该代码重构为一个公共模块,并作为一个凉亭(私有)工件公开。

方法 a) 处理变量中的变化

1) 外观和感觉 - 皮肤 每个租户使用一个 CSS。

2) 数据 如果 JSON 模式不同,您就会遇到问题。我建议只使用方法 b)。 如果您看到添加+减去某些字段,那您很好。 强烈建议创建 JSON 架构。

3) 输入表单 我建议从 JSON Schema + 一些元数据驱动表单。 您是否可以将相同的 AngularJS 模板与大量 ng-if、ng-switch 用于租户变化?如果没有,那就去单独的表格。您是否以太多这样的“单独表格”而告终?然后你回到方法 b)。

4) 表单验证

您可以使用 JSON 模式并使用验证属性进一步装饰它。 (不知道您的堆栈提供什么,但在 Java Bean 验证注释非常方便 - 您可以在构建时将它们外部化并将它们与客户端捆绑在一起,以便表单输入字段可以从模式驱动实用地应用验证。)

5) 工作流程 如果您看到每个客户端的路由逻辑发生变化 - 使用角度路由器并为每个租户定义路由。

6) 报告 假设这些是为每个租户量身定制的一些视图。它们有多少不同?如果您可以使用 ng-if/ng-switch 而不会弄乱模板,那么您可以创建单独的模板、视图(路由可以处理视图)。

7) i18n/l10n AngularJS 有很多实用程序,例如 $locale、ngPluralize,以及各种过滤器,例如货币、数据、数字。结帐AngularJS i18n

总的来说,良好的metadata 设计、Validation decorated JSON schemagood routing ([AngularJS routing ][2]) design 将帮助您将其保持为一个多租户应用程序,您可以在产品的整个生命周期内对其进行管理。

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 2020-11-27
    • 2017-06-11
    • 1970-01-01
    • 2017-09-02
    • 2014-03-21
    • 2015-07-08
    • 2014-09-01
    相关资源
    最近更新 更多