Autofac MultiTenant - 如何路由到子域?

时间:2012-06-06 16:15:47

标签: asp.net-mvc-3 autofac

n00b在这里。重新提问,因为我没有正确标记。

我正在尝试使用Autofac的MutliTenant功能。我从源文件中得到了一个“工作”的例子。我已经扫描了文档,并且无法弄清楚如何“路由”租户。

目前,我想将一个代码库用于基本的CRUD应用程序。 CRUD应用程序将由几个不同的站点使用,只关注单个站点的特定服务。

我最终想要这样做:

  • codebase.website1.com(租户1)
  • codebase.website2.com(租户2)
  • codebase.website3.com(租户3)

有任何想法或参考?感谢。

1 个答案:

答案 0 :(得分:1)

如果您查看the Autofac multitenant documentation on the wiki,您会发现确定租户的方式是实施ITenantIdentificationStrategy。该维基页面上有一个示例,显示如何从请求中的参数获取租户,如查询字符串。

修改示例以查看请求的其他部分(主机名,域名或其他任何部分)很容易。

using System;
using System.Web;
using AutofacContrib.Multitenant;

namespace DemoNamespace
{
  public class DomainStrategy : ITenantIdentificationStrategy
  {
    public bool TryIdentifyTenant(out object tenantId)
    {
      tenantId = null;
      try
      {
        var context = HttpContext.Current;
        if(context != null && context.Request != null)
        {
          var site = context.Request.Url.Authority;
          // Here's where you map the site to the tenant ID:
          tenantId = MapTheSiteToTheTenantId(site);
        }
      }
      catch(HttpException)
      {
        // Happens at app startup in IIS 7.0
      }
      return tenantId != null;
    }
  }
}

显然你需要按摩它才能为你工作。如何进行映射,无论是否返回null作为默认租户ID等等。

请注意,如果您正在基于HTTP请求值进行测试,那么无论何时解析依赖关系并且没有Web上下文,您都将获得应用程序级依赖项,而不是特定于租户的依赖项...因为您无法识别租户。您在catch块中看到了一个小工件 - 如果在应用程序启动时解析了任何依赖项,则不一定是Web上下文,因此当您调用HttpContext.Current时,IIS 7.0会抛出HttpException。你必须测试那样的东西。

此外,您还需要考虑租户ID映射的缓存策略,例如,服务电话或昂贵的东西。每次解决多租户依赖关系时都会调用策略,因此您希望尽可能高效地实施策略。

I would really recommend checking out that documentation.这很长,但这是因为多租户是一个复杂的话题,还有很多内容可以覆盖。如果你潜入那里,你会找到这样的问题的答案。