【发布时间】:2020-06-26 10:28:39
【问题描述】:
我在.net core 3.1中创建了一个应用程序,其中有一个单例接口及其实现类,用于接收TCP/IP套接字消息。类中有一个事件处理程序,一旦在套接字上收到消息就会调用它。
公共类 IncomingMessageHandler : IIncomingMessageHandler
{
公共事件 EventHandler OnMessageReceived;
私人无效InvokeMessageRecived(对象发件人,字符串消息)
{
this.OnMessageReceived?.Invoke(this, message);
}
}
还有另一个服务TransactionService 类为接口IIncomingMessageHandler 注入了依赖项并订阅OnMessageReceived。
public TransactionService(IIncomingMessageHandler incomingMessageHandler)
{
this.incomingMessageHandler = 传入消息处理程序;
this.incomingMessageHandler.OnMessageReceived += this.IncomingMessageHandler_OnMessageReceived;
}
在这个类中,我正在启动事务,一旦事务开始,我将在IncomingMessageHandler 和OnMessageReceived 调用中接收消息,我将消息存储到列表中以供进一步处理。
现在TransactionService 是Scoped 服务类,将为每个API 请求创建新对象,现在如果有多个请求,每个TransactionService 将订阅OnMessageReceived,它会多次调用,因为有是多个对象启动并覆盖消息列表。
由于其他一些限制,我无法将 TransactionService 注册为单例。
有没有其他方法可以只为特定的服务对象调用OnMessageReceived?
我已尝试取消订阅OnMessageReceived,但仍然会同时出现多个 API 请求。
【问题讨论】:
-
你有一个队列系统,你有来自多个来源的输入和一个 API 来处理数据。您必须像处理任何其他排队系统一样处理此问题。见维基:en.wikipedia.org/wiki/Queue_management_system
-
感谢您的评论,我不确定这是否与排队有关,而且我无法限制每个人的 API 访问权限并应用任何队列机制。
-
您所描述的是一个队列系统,它具有类型(FIFO/优先级)、单例/并行和锁定(如果需要)。
标签: c# .net-core dependency-injection event-handling asp.net-core-webapi