我有一个使用Autofac多租户容器的.net核心web应用程序。租户策略通过查看HTTP请求的路径来解决租户问题。
但是,有一个特定的功能,租户A需要使用另一个租户B的配置(在本例中是子租户);问题是,直到承租者A已经执行了一些逻辑来知道它需要使用哪个子租户的配置时,才知道它的配置。
是否有方法在运行时获得另一个租户的服务?
我会尝试以一个例子加以澄清:
我所拥有的或多或少:
获取my.host.net/A/rules
我试过/想过什么?
发布于 2020-12-11 15:26:45
我不知道“分租客”在这种情况下是什么意思。Autofac在其多租户支持中没有多层租赁的概念,因此,虽然这个构造在应用程序的上下文中可能是有意义的,但是尝试在Autofac中实现这个功能并不简单。
试图改变租户的中间请求,充其量将是一个挑战。通过请求管道(中间件、控制器等)都希望使用在请求中设置的第一件事的HttpContext.RequestServices。就像,它实际上是第一个运行的中间件。一旦它设置好了,管道就开始解析,控制器和其他东西开始解析,然后.锁在那个房客身上了。你不能换。
考虑到这一点,我会提醒您,不要试图从一个租户那里解决一些问题,切换中间请求,并从另一个租户解决其余的问题。很可能你会发现不一致。
假设您有一个接受ISomeCoolService的中间件实例。您也有一个需要ISomeCoolService的控制器,但是您在控制器中使用特殊的租户切换逻辑,而不是将其视为依赖项。在中间件执行期间,中间件将获得承租者A的ISomeCoolService,但控制器将使用承租者B的ISomeCoolService,而现在您的应用程序行为不一致。试图确保与租户转换的一致性将是非常非常困难的。
以下是我的建议:
ITenantIdentificationStrategy中预先完成所有租户的确定,并将其缓存到(比方说,HttpContext.Items )中,这样您就不必再查找它了--请这样做。使用初始的租户确定逻辑,管道中的第一个命中可能很慢,但在此之后,ITenantIdentificationStrategy可以在HttpContext.Items中查找租户ID,而不是执行数据库调用,而且速度很快。这将使您不必切换租户mid-request.如果您真的、真的、真的只致力于使这个租户“层次结构”工作,您可以尝试分叉Autofac.Multitenant支持和implementing a new MultitenantContainer that allows for sub-tenants。MultitenantContainer的逻辑实际上并不复杂,它只是存储每个租户标记的生存期范围。假设,您可以添加一些功能来启用子租户配置。这不会是五分钟的工作,也不是我们计划添加到Autofac的真正的事情,所以它将是一个完整的叉子,你可以拥有,但你有可能做到。
https://stackoverflow.com/questions/65219471
复制相似问题