AngularJS多租户

mma*_*007 13 multi-tenant angularjs

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

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

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

谢谢!

bha*_*tol 12

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

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

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

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

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

方法a)处理变量的变化

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

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

3)输入表单 我建议从JSON Schema +一些元数据中驱动表单.您是否可以使用相同的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 schema并且good routing ([AngularJS routing ][2]) design可以帮助您保持单个多租户应用程序,您可以在产品的良好生命周期内管理它.