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

时间:2013-06-26 17:22:58

标签: c# asp.net-mvc

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

我意识到这可能是一个非常深入的答案......但我不知道从哪里开始或者搜索什么来开始研究这个问题。有什么指示,我可以进一步研究吗?

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

视图

使用基于用户的Switch语句返回不同的视图。

CSS

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

资源文件

我现在不使用它们但需要实现,所以不确定它们是如何工作的。从我所看到的,您可以在MetaData级别指定一个资源文件,这是一个编译时间。不确定如何在用户级别更改此设置。我可以看到here,如何根据文化来改变它......但不是通过用户个人资料属性(就像他们所属的公司那样)。

This看起来像是一个开始......将会进行更多审核。

业务逻辑

在我的服务层,我可以实现switch语句......但这看起来很混乱。有没有办法创建一个覆盖基类但只针对某些用户的新类?或者将它们放在一个单独的项目/ dll中,并且只为某个用户使用该dll参考?

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

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

我缺少任何其他考虑因素?

2 个答案:

答案 0 :(得分:2)

  

使用switch语句

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

当您有相似但不同的要求时,polymorphism是您的朋友。

如果不了解您的要求的完整详细信息,很难提供具体的答案,但请考虑使用factory pattern / dependency injection来提供适合特定用户的对象(或者更有可能提供给公司的对象)与特定用户相关联。)

用户界面

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

我对ASP.Net MVC中布线路线的具体细节不太熟悉,建议如何具体设置,但感觉就像是正确的方法。也许另一张海报可以带来更多亮点。

业务逻辑

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

数据本地化

数据库中的订单状态等内容不应绑定到“打开”等文本。它们应该绑定到二​​进制表示(例如INT)。将其保留在视图中,将该含义转换为特定于用户语言的内容。

答案 1 :(得分:2)

在我们开发的SaaS应用程序中,我们拥有拥有自己的私有域的客户,因此能够支持类似的东西。我们必须能够支持:

  • www.mycompany.com/u/clientname
  • clientname.mycompany.com
  • www.clientname.com

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

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

我们最终得到的结果类似于人们称之为“便携式区域”或基本上是外部视图和控制器的大会。

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

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

没有简单的答案,对一个SaaS项目有效的方法对另一个项目可能无法完全相同。您的架构可能类似,但您的业务需求将决定您的项目带给您的位置!