【问题标题】:Autofac multitenant - override tenant in runtimeAutofac 多租户 - 在运行时覆盖租户
【发布时间】:2021-03-20 23:41:50
【问题描述】:

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

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

有没有办法在运行时获取另一个租户的服务?

我会尝试用一个例子来说明:

我所拥有的或多或少:

  • 对 GET my.host.net/A/rules 的 HTTP 请求
  • 租户解析器能够识别当前租户是 A(它在路径中,就在主机名之后)
  • 租户解析器从数据库中获取通用规则,其中一条表示应该使用另一个租户B的配置
  • 从现在开始,我想使用租户 B 的服务。

我尝试过/想到了什么?

  • 保存多租户容器并使用 GetTenantScope 在解析要使用的服务的类工厂中解析租户 B 的范围。但是,我不知道在内存使用方面的影响以及混合租户可能出现的问题
  • 忘记多租户,只需将每个租户的配置保存在特定类中。

【问题讨论】:

    标签: .net-core dependency-injection containers autofac multi-tenant


    【解决方案1】:

    我不确定在这种情况下“子租户”是什么意思。 Autofac 在其多租户支持中没有多级租户的概念,因此虽然这种结构在 您的应用程序 的上下文中可能是有意义的,但尝试在 Autofac 中实现该工作 是不会很简单。

    尝试在请求中切换租户充其量是一个挑战。通过请求管道(中间件、控制器等)的事物都将要使用在请求中设置的第一件事 HttpContext.RequestServices。就像,它实际上是第一个运行的中间件。设置好后,管道开始解析,控制器和其他东西开始解析,并且......它被锁定到该租户中。你不能切换它。

    鉴于此,我会提醒您不要尝试从一个租户处解决某些问题,在请求中切换,并从其他租户处解决其余问题。您可能会遇到不一致的情况。

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

    以下是我的建议:

    • 如果您可以在 ITenantIdentificationStrategy 中预先确定所有租户,并将其缓存在 HttpContext.Items 中,这样您就不必再次查找 - 这样做。最初的租户确定逻辑在管道中的第一次命中可能会很慢,但之后ITenantIdentificationStrategy 可以在HttpContext.Items 中查找租户ID,而不是进行数据库调用,它会很快。这将使您不必在请求中切换租户。
    • 如果您不能预先确定租户,并且您需要管道执行一段时间才能弄清楚...您可能需要一种不同的方式来确定租户。真的,尽量避免更换租户。它会永远给你带来微妙的问题。
    • 不要试图让“租户继承”工作,至少不要使用现有的 Autofac 多租户支持。我认识到说“某些服务是租户 A,而其他服务是租户 B,并且它会沿堆栈继承”会很好,但这不是多租户支持中内置的东西,而且很难试图强制工作。

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

    【讨论】:

    • 谢谢特拉维斯。你说的有道理。我所做的是将配置保存在主租户中,并使用此配置来使用正确的路径。
    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多