【发布时间】:2019-10-14 12:11:25
【问题描述】:
我已经实现了 WebSocket 中间件,它包含一个字段单例 WebSocket 字典(通过构造函数注入)和其他一些通过构造函数注入的范围参数。
我想知道它是否正确实施。
public WebSocketManagerMiddleware(RequestDelegate next,
IWebSocketConnectionDictionary webSocketDictionary,
IScopedServiceOne scopedOneService, IScopedServiceTwo scopedtwoService)
{
_next = next;
_webSocketManager = webSocketDictionary;
_scopedOneService= scopedOneService;
_scopedtwoService= scopedtwoService;
}
对于这个构造函数,我像这样注入这些实例:
_app.UseMiddleware<WebSocketManagerMiddleware>(
app.ApplicationServices.GetWebSocketConnectionDictionary(),
serviceProvider.CreateScope().ServiceProvider.GetScopedOneService(),
serviceProvider.CreateScope().ServiceProvider.GetScopedTwoService())
恐怕我每次在 WebSocket 请求上都会创建新的范围,我从中获得范围服务(serviceOne,serviceTwo),并且在 WebSocket 连接关闭之前它从未被释放。因为我只在 websocket 启动时使用这些服务,并且在我开始收听即将到来的消息之后我从不使用它们(IScopedOneSerice,IScopedTwoService)
public async Task Invoke(HttpContext context, IServiceProvider service)
{
await _scopedOneService.MethodOne();
await _scopedTwoService.MethodTwo();
//startint to listen for messages and if I need to call some repository
// method I am using
//IServiceProvider, i.e ISomeRepository repo =
// service.GetRequiredService<ISomeRepository>(); // this repo scoped as well
}
这样有可能导致内存泄漏吗?
更新: 我想要实现的目标:让我们简单一点,每次收到 websocket 消息时,我都需要将消息插入存储库或解析与其他业务逻辑服务通信的其他一些服务。
我不确定将作用域服务注入包含单例 websocket 字典和其他一些作用域服务的 websocket 中间件的最佳方法是什么。
【问题讨论】:
-
我认为您应该使用注入的
IServiceScopeFactory解决中间件内部的范围服务,而不是尝试从外部获取它们。将构造函数中的作用域服务替换为单个IServiceScopeFactory并存储它。每次您必须使用其中一个作用域服务时,通过创建一个新作用域并从那里解析它们来获取它们。 -
我应该将作用域服务与 using() 一起使用,以便在使用后可以轻松处理吗?
-
您能说明一下您要达到的目标(逐步流程)吗?
-
好的,我会更新我的帖子
-
1. WebSocket 客户端连接到我的中间件。 2. 添加一个新的 Websocket 到 Dictionary。 3、使用ScopedServiceOne、ScopedServiceTwo验证WebSocket连接是否正确。 4. 如果验证通过,那么我开始收听新消息 5. 新消息到达我解决了一些范围方法,该方法从消息中计算数据并插入数据库 6. 发送对消息的响应
标签: c# dependency-injection websocket .net-core middleware