1

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

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

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

我最终想这样做:

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

有什么想法或参考吗?谢谢。

4

1 回答 1

1

如果您查看wiki 上的 Autofac 多租户文档,您会注意到您确定租户的方式是通过实现ITenantIdentificationStrategy. 该 wiki 页面上提供了一个示例,显示了如何从请求中的参数(如查询字符串)中获取租户。

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

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 映射的缓存策略。每次您解决多租户依赖关系时,都会调用该策略,因此您希望使策略实现尽可能高效。

我真的建议您查看该文档。它很长,但那是因为多租户是一个复杂的主题,并且需要涵盖很多内容。如果你深入那里,你会找到这些问题的答案。

于 2012-06-07T14:59:04.093 回答