基于数据库条目的动态路由

时间:2012-03-05 21:32:44

标签: asp.net-mvc-3 dynamic asp.net-mvc-routing asp.net-mvc-3-areas

正如经常发生的那样,我对一个问题有一个很好的解决方案,不幸的是这会导致另一个问题。

我们有一个应用程序,为各个组织的成员提供服务,这些组织是更大父母的一部分。组织需要自定义URL。因此,组织A的成员访问URL https://server/vdir/OrgA,组织B的成员访问URL https://server/vdir/OrgB

这两者都会映射到应用中完全相同的区域,控制器和操作,尽管由于某些自定义视图内容,它们可能与最终用户看起来不同。

因为使用此应用程序的组织列表是动态的,并且因为并非所有组织都会同时开始使用它,所以我开始以编程方式设置路由映射。在目标区域中,我重写RegisterArea方法,从数据库中提取活动组织,并为每个组织执行自定义context.MapRoute调用。

这样做可以避免另一个问题,即其中包含组织sitepath(“OrgA”)的URL看起来与那些在其中具有有意义的区域名称的URL完全相同,实际上映射到某个区域。将组织站点路径视为虚拟区域名称并将其显式映射到目标区域可避免某些误导。

这很有效。但是:它全部在Application_Start执行。如果我们添加一个组织,它会在我们重新启动应用程序之后才会生效,这对那些当时正在使用它的人来说会造成很大的破坏。

所以我的问题是两个:

  1. 这样做有没有比我更好的方法?我研究了这个问题,但是相关的关键词无处不在,以至于它处于一种针灸和大海捞针的状态。
  2. 如果没有,有没有办法刷新路由映射而不重新启动应用程序?

1 个答案:

答案 0 :(得分:2)

Phil Haack写了一篇文章dealing with exactly this problem

真正非常简短的版本是将路由注册放在Global.asax以外的文件中并缓存该文件的内容。缓存将文件作为依赖项,并在缓存无效(读取:文件被更改)重新注册路由时调用方法。