如何在没有大量重写的情况下在现有的asp.net-mvc网站上添加新路由?

时间:2013-03-09 00:02:50

标签: c# sql-server asp.net-mvc nhibernate refactoring

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

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

背景:

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

鉴于此,我有Single or Multiple Database decision to make like this questiondiscussed on Joel's podcast(如果可能的话,我试图将它保存到单个数据库中,因为有些用户希望查看这两个组织)所以我有点必须与shared in the multi tenant database decision

一起使用

如播客中所述,作为示例,有一个表。这很简单,因为如果我只是查询表,只需在其中添加一个" ,其中Person.Org =" A" 。但它也会影响与人员表直接或间接联接的任何查询。所以假设我有一个 Car 表,并且有一个所有者列(这将是表中的外键),如果我有我首先要与一起加入汽车,然后添加该过滤器(在从汽车中选择* 之前)。我正在使用nhibernate但你明白了

问题:

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

我不想通过每一个控制器操作并添加一个新参数或一个路径,即"组织名称"或类似的东西,所以我想看看是否有任何想法。即使它运行了两个不同的网站,如果我想在单个代码库中运行,我仍然需要进行全局切换。

是否有建议,以便我可以避免在每个控制器操作上添加其他参数?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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

...
customer = UrlParameter.Optional

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

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