我正在使用MVC 4 / C#4构建托管业务SaaS应用程序。我需要拥有尽可能利用基本代码层的客户特定资源文件,css,视图和业务逻辑。如何构建这些(资源文件,css,视图,逻辑)以实现这一目标?
我意识到这可能是一个非常深入的答案......但我不知道从哪里开始或者搜索什么来开始研究这个问题。有什么指示,我可以进一步研究吗?
以下是我对每个问题的初步想法:
视图
使用基于用户的Switch语句返回不同的视图。
CSS
在视图中使用switch语句指定要加载的css
资源文件
我现在不使用它们但需要实现,所以不确定它们是如何工作的。从我所看到的,您可以在MetaData级别指定一个资源文件,这是一个编译时间。不确定如何在用户级别更改此设置。我可以看到here,如何根据文化来改变它......但不是通过用户个人资料属性(就像他们所属的公司那样)。
This看起来像是一个开始......将会进行更多审核。
业务逻辑
在我的服务层,我可以实现switch语句......但这看起来很混乱。有没有办法创建一个覆盖基类但只针对某些用户的新类?或者将它们放在一个单独的项目/ dll中,并且只为某个用户使用该dll参考?
我曾经在IBM iSeries上工作过,他们有一个库路径的概念,可以由用户在登录时设置。您将拥有一个覆盖基本代码路径库的自定义代码路径。 MVC中有类似的内容吗?
数据本地化 在我的数据库中,我有一个Orders表和OrderStatuses的另一个表,可以在下拉列表中显示,供用户选择状态。这些状态可能是“打开”和“关闭”。但是另一位顾客可能想要用西班牙语...你会怎么处理这个?
我缺少任何其他考虑因素?
答案 0 :(得分:2)
使用switch语句
每当有人编写面向对象的代码并提及控制变量要求的switch语句时,警报灯就会开始闪烁。
当您有相似但不同的要求时,polymorphism是您的朋友。
如果不了解您的要求的完整详细信息,很难提供具体的答案,但请考虑使用factory pattern / dependency injection来提供适合特定用户的对象(或者更有可能提供给公司的对象)与特定用户相关联。)
用户界面
一般来说,您可以使用工厂返回基于公共子类的控制器实例,这些实例实现特定用户/客户的需求并返回适合该用户的视图。
我对ASP.Net MVC中布线路线的具体细节不太熟悉,建议如何具体设置,但感觉就像是正确的方法。也许另一张海报可以带来更多亮点。
业务逻辑
当需求变化很大时,这是多态性的经典用法。每个客户类的替代方案包括配置驱动的行为和规则引擎。最佳选择取决于您的具体选择。
数据本地化
数据库中的订单状态等内容不应绑定到“打开”等文本。它们应该绑定到二进制表示(例如INT)。将其保留在视图中,将该含义转换为特定于用户语言的内容。
答案 1 :(得分:2)
在我们开发的SaaS应用程序中,我们拥有拥有自己的私有域的客户,因此能够支持类似的东西。我们必须能够支持:
我们考虑的是我们如何使用单个部署/代码库来处理所有这些客户端。我们最终得到的是一个Base系统,可以通过使用“插件”进行扩展,这些插件基本上是名为“APP.Clients。{ClientName}”的类库。
我们编写了一个自定义ViewEngine,允许我们使用这些插件从客户端自定义插件加载视图,控制器甚至控制器操作,以覆盖基础站点。
我们最终得到的结果类似于人们称之为“便携式区域”或基本上是外部视图和控制器的大会。
客户端可以共享一个共同的“网络”数据库,也可以将它们滚动到自己的数据库中。大多数配置都来自于读取当前URL并具有可以确定它是哪个“客户端”并加载其设置并处理其自定义的逻辑。
能够加载客户端视图需要为母版页,视图和部分视图添加额外的搜索位置(为什么我们有自定义ViewEngine)。
没有简单的答案,对一个SaaS项目有效的方法对另一个项目可能无法完全相同。您的架构可能类似,但您的业务需求将决定您的项目带给您的位置!