首页 > 解决方案 > 注册为 services.AddSingleton 但使用 using 块启动时如何处理资源

问题描述

我正在使用 .NET Core 3.1。

我有一个简单的发布类,其目的是将消息发布到消息代理。消息代理的所有逻辑都在一个单独的类库中,并且发布类本身需要以某种方式获得连接才能发布消息,所以它看起来像这样:

 public class Publisher : IPublisher
 {
    public void Publish(string subject, PublishMessage message)
    {
        var options = ConnectionFactory.GetDefaultOptions();

        using (var connection = new ConnectionFactory().CreateEncodedConnection(options))
        {
            connection.OnSerialize = jsonSerializer;
            connection.Publish(subject, message);
            connection.Flush();
        }
    }
 }

顺便说一下new ConnectionFactory().CreateEncodedConnection(options),消息代理是原生的,所以这不是我写的包装器。

然而。在我的网络项目中,我像这样在 DI 中注册它:

services.AddSingleton<IPublisher, Publisher>();

我的最终目标是共享相同的连接,我知道当时机成熟时,DI 将处理所有可支配资源,但由于我将连接包装在 using 块中,它是否总是处理连接并为每条消息或创建一个新连接DI 设法以某种方式处理这个问题。如果没有,我该怎么做才能不为每条消息创建连接?

标签: c#dependency-injectiondispose

解决方案


services.AddSingleton<IPublisher, Publisher>();应用程序启动时创建类的实例Publisher,但每次调用Publish方法时都会创建和释放连接。


推荐阅读