1

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

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

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

意见

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

CSS

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

资源文件

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

看起来像一个开始......将审查更多。

商业逻辑

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

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

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

我还缺少任何其他注意事项吗?

4

2 回答 2

2

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

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

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

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

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

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

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

没有简单的答案,适用于一个 SaaS 项目的方法可能与另一个项目不完全相同。您的架构可能会相似,但您的业务需求将决定您的项目将带您去哪里!

于 2013-06-26T17:37:25.380 回答
2

使用 switch 语句

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

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

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

界面层

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

我对 ASP.Net MVC 中的布线细节不够精通,无法建议如何具体设置它,但感觉是正确的方法。也许另一张海报可以提供更多的信息。

商业逻辑

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

数据本地化

数据库中的订单状态等内容不应绑定到“打开”之类的文本。它们应该绑定到二​​进制表示(例如 INT)。将其留给 View 以将该含义翻译成特定于用户语言的内容。

于 2013-06-26T17:33:00.780 回答