首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac多租户-在运行时重写租户

Autofac多租户-在运行时重写租户
EN

Stack Overflow用户
提问于 2020-12-09 15:10:52
回答 1查看 222关注 0票数 0

我有一个使用Autofac多租户容器的.net核心web应用程序。租户策略通过查看HTTP请求的路径来解决租户问题。

但是,有一个特定的功能,租户A需要使用另一个租户B的配置(在本例中是子租户);问题是,直到承租者A已经执行了一些逻辑来知道它需要使用哪个子租户的配置时,才知道它的配置。

是否有方法在运行时获得另一个租户的服务?

我会尝试以一个例子加以澄清:

我所拥有的或多或少:

获取my.host.net/A/rules

  • The租户解析器的HTTP请求能够识别当前租户是A(在路径中,仅在主机名之后)租户解析器从数据库中获取一般规则的
  • ,其中一条表示从这里开始另一个租户B的配置应该使用
  • ,我想使用租户B的服务。

我试过/想过什么?

  • 保存多租户容器,并在解析要使用的服务的类工厂中使用GetTenantScope来解析租户B的范围。但是,我不知道在内存使用方面的含义,以及混合tenants
  • Forget有关多租户和只在特定类中保存每个租户配置时可能出现的问题。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-11 15:26:45

我不知道“分租客”在这种情况下是什么意思。Autofac在其多租户支持中没有多层租赁的概念,因此,虽然这个构造在应用程序的上下文中可能是有意义的,但是尝试在Autofac中实现这个功能并不简单。

试图改变租户的中间请求,充其量将是一个挑战。通过请求管道(中间件、控制器等)都希望使用在请求中设置的第一件事的HttpContext.RequestServices。就像,它实际上是第一个运行的中间件。一旦它设置好了,管道就开始解析,控制器和其他东西开始解析,然后.锁在那个房客身上了。你不能换。

考虑到这一点,我会提醒您,不要试图从一个租户那里解决一些问题,切换中间请求,并从另一个租户解决其余的问题。很可能你会发现不一致。

假设您有一个接受ISomeCoolService的中间件实例。您也有一个需要ISomeCoolService的控制器,但是您在控制器中使用特殊的租户切换逻辑,而不是将其视为依赖项。在中间件执行期间,中间件将获得承租者A的ISomeCoolService,但控制器将使用承租者B的ISomeCoolService,而现在您的应用程序行为不一致。试图确保与租户转换的一致性将是非常非常困难的。

以下是我的建议:

  • If --您可以在ITenantIdentificationStrategy中预先完成所有租户的确定,并将其缓存到(比方说,HttpContext.Items )中,这样您就不必再查找它了--请这样做。使用初始的租户确定逻辑,管道中的第一个命中可能很慢,但在此之后,ITenantIdentificationStrategy可以在HttpContext.Items中查找租户ID,而不是执行数据库调用,而且速度很快。这将使您不必切换租户mid-request.
  • If,您无法进行预先的租户确定,并且您需要执行一段时间的管道,然后才能计算出.您可能需要一种不同的方法来确定租户。真的,尽量避免换房客。它将导致您的微妙问题,forever.
  • Don't试图使“租户继承”工作,至少没有与股票Autofac多租户的支持。我认识到,说“一些服务是承租者A,而另一些服务是承租者B,并且它继承了堆栈”是很好的,但这不是构建在多租户支持中的东西,而且很难强迫它工作。

如果您真的、真的、真的只致力于使这个租户“层次结构”工作,您可以尝试分叉Autofac.Multitenant支持和implementing a new MultitenantContainer that allows for sub-tenantsMultitenantContainer的逻辑实际上并不复杂,它只是存储每个租户标记的生存期范围。假设,您可以添加一些功能来启用子租户配置。这不会是五分钟的工作,也不是我们计划添加到Autofac的真正的事情,所以它将是一个完整的叉子,你可以拥有,但你有可能做到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65219471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档