制作Saas MVC应用程序..需要特定于客户的视图、资源文件和逻辑

本文关键字:视图 资源 源文件 客户 应用程序 MVC Saas 于客户 制作 | 更新日期: 2023-09-27 18:20:04

我正在使用MVC 4/C#4构建一个托管的业务SaaS应用程序。我需要有客户特定的资源文件、css、视图和业务逻辑,它们尽可能地利用基本代码层。这些(资源文件、css、视图、逻辑)需要如何结构化才能实现?

我意识到这可能是一个非常深入的答案。。。但我不知道从哪里开始,也不知道从什么开始研究这个问题。有什么可以让我进一步研究的建议吗?

以下是我对每一个的初步想法:

视图

根据用户使用Switch语句可以返回不同的视图。

CSS

使用视图中的switch语句指定要加载的css

资源文件

我现在没有使用它们,但需要实现,所以不确定它们是如何工作的。根据我所看到的,您可以在类MetaData级别指定资源文件,这是编译时的事情。不确定如何在用户级别更改。我可以在这里看到,如何根据文化来改变它。。。但不是通过用户配置文件属性(比如他们所属的公司)。

这看起来像是一个开始。。。将进行更多审查。

业务逻辑

在我的服务层中,我可以实现switch语句。。。但这似乎很混乱。有没有一种方法可以创建一个新的类来覆盖基类,但只适用于某些用户?或者把这些放在一个单独的项目/dll中,只对某个用户使用该dll引用?

我曾经在IBMiSeries上工作,他们有一个库路径的概念,可以由用户在登录时设置。您将有一个自定义代码路径来覆盖基本代码路径库。MVC中有类似的东西吗?

数据本地化在我的数据库中,我有一个Orders表和另一个OrderStatues表,它们可以显示在下拉列表中,供用户选择状态。这些状态可以是"打开"answers"关闭"。但另一位客户可能想要西班牙语。。。你会怎么处理?

我还缺少其他考虑因素吗?

制作Saas MVC应用程序..需要特定于客户的视图、资源文件和逻辑

使用切换语句

每当有人在编写面向对象的代码,并提到控制可变需求的switch语句时,警报灯就会开始闪烁。

当您有相似但不同的需求时,多态性就是您的朋友。

在不了解需求的全部细节的情况下,很难提供具体的答案,但可以考虑使用工厂模式/依赖项注入来提供适合特定用户(或者更可能是与特定用户相关的公司)的对象。

UI层

一般来说,您可以使用工厂来返回基于公共子类的控制器实例,这些实例实现特定用户/客户的需求,并返回适合该用户的视图。

我对ASP.NETMVC中布线路由的细节还不够熟悉,无法建议如何具体设置,但这感觉是正确的方法。也许另一张海报可以带来更多的光。

业务逻辑

当需求差异很大时,这是多态性的经典用法。每个客户类的替代方案包括配置驱动的行为和规则引擎。最佳选择取决于您的具体需求。

数据本地化

DB中的订单状态等内容不应绑定到"打开"之类的文本。它们应该绑定到二进制表示(例如INT)。让视图将该含义转换为特定于用户语言的内容。

在我们开发的SaaS应用程序中,我们的客户有自己的私有域,因此必须能够支持这样的功能。我们必须能够支持:

  • www.mycompany.com/u/clientname
  • 客户名称.mycompany.com
  • www.clientname.com

我们考虑的一件事是如何使用单个部署/代码库来处理所有这些客户端。我们最终得到的是一个基本系统,可以通过使用"插件"进行扩展,这些插件基本上是名为"APP.Clients.{ClientName}"的类库。

我们编写了一个自定义ViewEngine,允许我们使用这些插件从客户端自定义插件加载视图、控制器甚至控制器操作,以覆盖基站。

我们最终得到的类似于人们所说的"便携式区域",或者基本上是程序集中的外部视图和控制器。

客户端可以共享一个通用的"网络"数据库,也可以将它们转移到自己的数据库中。大多数配置都来自于读取当前URL,并具有可以确定它是哪个"客户端"的逻辑,加载它们的设置并处理它们的自定义。

能够加载客户端视图需要为母版页、视图和局部视图添加额外的搜索位置(为什么我们有自定义的ViewEngine)。

没有简单的答案,适用于一个SaaS项目的方法可能不适用于另一个项目。您的体系结构可能相似,但您的业务需求将决定您的项目走向何方!