如何开始使用多租户MVC应用程序

4

我已经搜索了一些例子,但它们都是整个大项目。我正在寻找一些关于如何开始构建MVC多租户应用程序的样例。我认为,第一部分将会是破译URL。

在ASP.Net中,我是这样做的。我从查看DNN代码中得到了这个结果。在MVC中,我该怎么做呢?

Global.asax

private void Application_BeginRequest(Object source, EventArgs e)
{
  HttpApplication application = (HttpApplication)source;
  HttpContext context = application.Context;

  string domainName = string.Empty;
  // domaName now contains 'example' if application.Request was www.example.com
  domainName = GetDomainName(application.Request);

  // Using domain, get the info for example from the database
  object myPortal = // get from database
  // Save in context for use on other pages
  context.Items.Add("PortalSettings", myPortal);
}

然后在我的基础页面中,我从上下文中获取值。

2个回答

4
我认为更强大的方法是定义一个自定义路由。在这个自定义路由中,您可以提取域并将其放入路由值中。
然后,您可以有一个基本控制器(如Josh所描述的),它定义了一个Domain属性或类似的属性,并将该值存储在那里以方便使用(或根据需要进行提取;无论哪种方式)。
通过这样提前将它拉入路由值中,您可以在应用程序中请求路径上的任何地方使用该信息,而不仅仅是在控制器中,因此您可以更多地重复使用它。例如,您可以在自定义授权过滤器中使用它来处理用户对该域的权限等等。

Paul,你知道有没有一些示例代码的网站可以展示你所建议的内容吗?谢谢。 - Picflight
不过,我查阅的每一本MVC书籍都有很好的记录自定义路由的内容。我会尝试找到相关资料的。 - Paul

2
  1. 获得域名。你已经使用了DNN代码,可以在调试器中查看请求静态变量;那里有各种酷炫的东西。
  2. 你可能需要一个用户存储库。我使用自定义数据库,但是你也可以使用 Microsoft 成员资格提供程序和配置文件提供程序。将域作为用户的属性,或将其作为组织的属性,将组织作为用户的属性。
  3. 将用户的域名存储在 cookie 中并进行加密。在请求开始时读取 cookie,并确保用户具有访问该组织/域的权限。
  4. 创建一个扩展 Controller 的 BaseController,然后使所有控制器都继承自它。在 BaseController 中,重写 OnActionExecuting 方法。这比在 Global.asax.cs 的 Begin_request 中执行初始请求设置要简单得多,因为你可以定义受保护成员,这些成员将适用于每个控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接