我将用一个简单的 Web 应用程序来说明这个问题。应用程序代码可在GitHub中获取。该应用程序处理两个请求:
POST /sockets/{id}/subscribe
— 订阅具有给定 ID 的套接字并记录其接收到的数据。POST /sockets/{id}/unsubscribe
— 取消订阅具有给定 ID 的套接字。该应用程序包含一个
SocketManager
对象,如下所示:
public class SocketHandler : IDisposable
{
private readonly Socket _socket;
private readonly ILogger<DataProcessingService> _logger;
public SocketHandler(int socketId, ILogger<DataProcessingService> logger)
{
_logger = logger;
_socket = new Socket(socketId, ProcessData);
}
private void ProcessData(int socketId, byte[] data)
{
_logger.LogInformation("Processing {Length} bytes data from socket {SocketId}", data.Length, socketId);
}
}
问题是我需要为每个
SocketHandler
请求创建 POST /sockets/{id}/subscribe
对象的新实例,因此我无法使用依赖注入。
当应用程序很小时,这并不是什么大问题,但随着应用程序的增长,它很快就会变成一个问题。特别是:
SocketHandler
将需要额外的依赖项来完成其工作。这意味着我现在需要为每个请求创建每个依赖项的新实例。在某些时候,我的大多数类将不再由依赖注入容器管理。SocketHandler
依赖关系需要来自依赖关系注入容器的无状态依赖关系,例如记录器。我必须要么将容器本身传递到依赖树的所有级别,以便需要记录器的人可以从那里获取它,要么传递记录器。无论我选择什么,我最终都会得到一个传递依赖项,这很混乱:想象一下必须通过依赖项树传递数十个依赖项。有人遇到过这个问题吗?你是怎么解决的?
您尝试过 Mediatr 库吗