【发布时间】:2020-10-12 14:27:31
【问题描述】:
假设我有自己的类QueueListener<TService, TPayload> 继承自BackgroundService。它打开 TCP 连接并监听传入的消息。在每条消息上,我想初始化 TService 类型的服务并将反序列化的 JSON 实例 TPayload 传递给它。 TService 将被注册为 Transient,因此这意味着作为有效负载的处理程序必须是轻量级和无状态的(在我当前的任务中)。为此,我将在我的QueueListener 的构造函数中注入IServiceProvider,并在它收到的每条消息上创建一个范围。这听起来像是一个计划还是我过度设计?我想避免TService 也是单例。
文档says:
从单例解析作用域服务是很危险的。可能导致服务在处理后续请求时状态不正确。
但我不完全确定这意味着什么。无法在BackgroundService 中注入作用域服务,因为它具有单例生命周期。他们是否警告我不要再像现在这样做事了?
UPD #1
我解释了为什么我要为每条消息创建范围。其背后的想法是防止侦听器被消息处理阻塞,并为其他开发人员提供创建自己的处理程序并对收到的消息做一些事情的可能性。例如,其他开发人员可以在处理时创建数据库连接,我希望在处理完成后关闭并释放它。
【问题讨论】:
-
你没有说你为什么认为你需要一个范围?您的
TService已注册为具有瞬态生命周期,这不需要范围。
标签: c# asp.net-core .net-core dependency-injection