2

我有一个带有 SQL 服务器后端的 asp.net-MVC 网站。有 100 个不同的表,该站点适用于 300 人的组织。

我们现在想将它用于另一个组织,然后是如何扩展站点的技术问题。以下是一些要求:

背景:

有许多表可以在两个组织之间完全重用,也有许多表我必须添加过滤器以确保我只获取与该特定组织相关的记录。

鉴于此,我有 像这个问题或Joel 的播客上所讨论的那样做出单一或多数据库决定 (如果可能,我试图将它保存到单一数据库,因为有用户想要查看两个组织)所以我排序在多租户数据库决策中必须使用共享

正如播客中所讨论的,作为示例,有一个People表。这很简单,因为如果我只是在查询people表,它只是在查询中添加一个“ where Person.Org = “A” 。但它也会影响与People表有直接或间接连接的任何查询。所以让我们说我有一个Car表,并且有一个Owner列(这将是People表的外键),如果我有一个 Cars 下拉列表,我首先必须加入People,然后添加该过滤器(在它只是Select *来自汽车)。我正在使用 nhibernate,但你明白了

问题:

我现在的重点是我正在尝试确定如何围绕我的所有 asp.net-mvc 控制器操作进行额外的切换以支持这个新组织。因此,如果我有 40 个控制器并且每个控制器有 10 个操作,我必须更新 400 个操作和每个页面(以及所有视图和 JavaScript 代码以指向某些 URL。我需要首先确定我是哪种“模式”在确定我是否应该查询 org 1 或 org 2

我不想遍历每一个控制器操作并添加一个新参数或“组织名称”或类似的路由,所以我想看看是否有任何想法。即使它运行两个不同的网站,如果我想在单个代码库中运行它,我仍然必须有这个全局开关。

有没有建议可以避免在每个控制器操作上添加额外的参数?

4

2 回答 2

1

假设您有一组有限的表(至少,控制器操作的表较少)并且您的 CRUD 操作是集中的,您可以在用户登录时在会话中设置 orgId 并使用该值来过滤所有查询?

于 2013-03-09T03:33:30.953 回答
0

Customer ID / Name在路线中添加有帮助吗?我在一个类似的应用程序上工作过,我的路由模式如下所示:

{customer}/{controller}/{action}/{id}

因为您已经有一个代码库,您可以将客户添加为可选参数:

{controller}/{action}/{id}/{customer}

...
customer = UrlParameter.Optional

无论哪种方式,您都需要在 Url 操作中提供路由值。在我的例子中,所有控制器都继承自一个基本控制器,该控制器通过自定义属性或代码来识别客户、检查安全性、授权等。基本控制器设置一个名为的受保护属性CurrentCustomer,其中包含所需的所有信息。它工作得很好,因为客户用户或管理员用户可以访问相同的界面。管理员用户可以访问多个客户的信息,并且该应用程序使用多个数据库(一个数据库可以包含多个客户)。

我认为您最好为每个客户拥有单独的数据库,以避免将客户 ID 传递给 SQL 语句/SP(并进行大量代码更改)。您只需要在运行时根据客户确定要使用哪个数据库。

于 2013-03-09T00:37:03.983 回答