AngularJS多租户

时间:2014-10-13 17:47:07

标签: angularjs multi-tenant

我正在组建一个小团队,设计一个流程管理系统,供同一行业内的几个不同客户使用。系统的目标和客户的高级要求非常相似。然而,正如预期的那样 - 一旦我们开始深入挖掘他们的个人需求,我们最终需要为每个客户提供一些非常广泛的定制,包括数据,输入表格,验证,工作流程,报告等。

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

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

谢谢!

1 个答案:

答案 0 :(得分:12)

这是一个设计问题,所以我的答案会很高。

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

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

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

方法b)如果您认为变化太多,请重新考虑制作这些单独的应用。随着你的进展,你可能会发现一些共性。您可以将该代码重新分解为公共模块,并将其公开为bower(私有)工件。

方法a)处理变量的变化

1)Look&感觉 - 皮肤 每个租户使用一个CSS。

2)数据 如果JSON架构不同,则表示存在问题。我建议你去寻找方法b)。 如果你看到一些字段添加+减去你就可以了。 强烈建议创建JSON模式。

3)输入表格 我建议从JSON Schema +一些元数据中驱动Forms。 您是否可以使用相同的AngularJS模板和大量的ng-if,ng-switch用于租户变化?如果没有,那么去单独的FORM。你最终会得到太多这样的“单独的表格”吗?然后你回到方法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可帮助您将其保留为单个多租户应用,您可以在产品的良好生命周期内管理该应用。