【发布时间】:2022-05-02 15:50:42
【问题描述】:
在我的 AspNetCore 应用程序中,我处理来自队列的消息。为了处理消息,我需要解析一些服务。其中一些服务依赖于ITenantId,我使用接收到的消息中的信息对其进行绑定。为了解决这个问题,消息的处理从创建一个子容器开始,然后我用它来创建一个IServiceScope,我从中解决所有需要的依赖关系。
消息可以并行处理,因此作用域必须相互隔离。
我可以找到创建子容器的方法,但我不确定哪种方法在性能、内存流失等方面最好:
选项A:每次消息到达时,将IServiceCollection克隆到一个新的ServiceCollection中,并在克隆的实例上重新绑定ITenantId。
选项 B:当程序启动时,创建 IServiceCollection 的不可变副本(使用 ImmutableList<ServiceDescriptor> 或 ImmutableArray<ServiceDescriptor>)。每次消息到达时,替换 ITenantId(导致 ImmutableList<ServiceDescriptor> 的新实例)并在新的不可变实例上调用 CreateScope()。
我不喜欢选项 A 的一点是,每次消息到达时都需要克隆整个服务集合。我不确定选项 B 中的不可变集合是否以更智能的方式处理这个问题?
【问题讨论】:
-
考虑不使用(任何)DI 容器作为分离特定于租户的状态的机制。因为这样做会导致“魔术”,其中一些服务将是状态感知的,而有些则不是(没有透明的说明为什么),以及如果你想对多个租户执行操作的低效率,你将不得不创建很多范围。相反,您可以使用内置“区域/租户”支持的缓存。但是,感谢您提出这个问题,我发现创建子容器的能力很有用,例如在测试自动化中,为每个并行线程创建一个克隆的子容器。
标签: asp.net-core .net-core dependency-injection