2012-06-06 32 views
1

n00b这里。重新提问,因为我没有标记正确。Autofac MultiTenant - 我如何路由到子域?

我想利用Autofac的MutliTenant功能。我从源文件中得到了一个“工作”的例子。我扫描了文档,无法找出如何“路由”租户。

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

我想最终做到这一点:

  • codebase.website1.com(承租人1)
  • codebase.website2.com(承租人2)
  • codebase.website3.com(租客3)

任何想法或参考?谢谢。

+0

此底层CRUD应用程序是否是从不同网站的代码中调用的单个运行实例?如果是这样,它的架构是什么? –

+0

@MarcL。我在想IIS 7.0,Win 2008 R2。是的,单个实例将被网站1或2或3调用。因此,在网站1上,将会有一个链接到codebase.website1.com等等。每个用户都将被认证,但是,基于该网站,所以来自网站2的用户2无法登录到codebase.website1.com。我希望这是有道理的。 – REMESQ

回答

1

如果您退房the Autofac multitenant documentation on the wiki您会注意到您确定租户的方式是实施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请求值进行测试,则任何时候解析依赖关系并且没有网络上下文中,您将获得应用程序级依赖性,而不是租户特定的依赖性......因为您无法识别租户。您会在catch块中看到一个很小的工件 - 如果在应用程序启动时任何依赖项得到解决,则不一定有Web上下文,因此在调用HttpContext.Current时,IIS 7.0会抛出HttpException。你必须测试这样的东西。

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

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

+0

这是我特别关注的代码,我想知道如何实现这个策略(wiki特别声明“只是示例,不建议使用)。虽然我看到你在if语句块中添加了代码,但我是一个n00b在这个。你是否推荐这种基于域名的策略作为声音?欣赏你的见解。 – REMESQ

+0

是的,我现在开始明白了。 :) – REMESQ

+0

不推荐使用的位是使用查询字符串参数来切换租户。这样做可以让别人改变他们的查询字符串并“成为”不同的租户。使用主机/域名是不同的,因为你不能真正搞乱并保持在同一个“站点” - 就浏览器而言,你实际上正在其他地方。 –