如何对有状态对象树使用依赖注入?

问题描述 投票:0回答:1

我将用一个简单的 Web 应用程序来说明这个问题。应用程序代码可在GitHub中获取。该应用程序处理两个请求:

  1. POST /sockets/{id}/subscribe
    — 订阅具有给定 ID 的套接字并记录其接收到的数据。
  2. 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
对象的新实例,因此我无法使用依赖注入。

当应用程序很小时,这并不是什么大问题,但随着应用程序的增长,它很快就会变成一个问题。特别是:

  1. 最终
    SocketHandler
    将需要额外的依赖项来完成其工作。这意味着我现在需要为每个请求创建每个依赖项的新实例。在某些时候,我的大多数类将不再由依赖注入容器管理。
  2. 假设依赖关系树深处的一个
    SocketHandler
    依赖关系需要来自依赖关系注入容器的无状态依赖关系,例如记录器。我必须要么将容器本身传递到依赖树的所有级别,以便需要记录器的人可以从那里获取它,要么传递记录器。无论我选择什么,我最终都会得到一个传递依赖项,这很混乱:想象一下必须通过依赖项树传递数十个依赖项。

有人遇到过这个问题吗?你是怎么解决的?

asp.net dependency-injection inversion-of-control
1个回答
0
投票

您尝试过 Mediatr 库吗

© www.soinside.com 2019 - 2024. All rights reserved.