1

以下问题:

我正在开发一个使用 RabbitMQ 连接到 API 的 WCF 服务。我们使用 spring 作为 DI 容器。

我们做了一个消费者类(一些用于rabbit MQ + logging的自定义逻辑)

精简版:


public class Consumer : DefaultBasicConsumer
{
    public Consumer(IModel channel)
            : base(channel)
        {}
}

我们有一个 ConnectionManager 类:


public class ConnectionManager
{
    public IModel Channel { get; set; }
    public IConnection Connection { get; set; }

    private readonly ConnectionFactory _connectionFactory;

    public ConnectionManager()
    {
        _connectionFactory = SetupConnectionFactory();

        Connection = _connectionFactory.CreateConnection();
        Channel = Connection.CreateModel();
    }
}

现在的问题是,在使用 Spring.NET 连接所有东西时。我们想将 ConnectionManager 类的 Channel 属性注入到 Consumer 构造函数中。

到目前为止的 Spring 配置(精简):

 <spring>
    <context>
      <resource uri="config://spring/objects"/>
    </context>
    <object name="connectionManager" type="Epex.ConnectionManager, EpexData" singleton="true"/>

    <object name="consumer" type="Epex.Consumer, EpexData">
      <constructor-arg ref="Do something funky here"/>
    </object>
</spring>

那么我在 Do Something funky 上放什么?

我们还可以在消费者中重写和注入 ConnectionManager(最后一个选项)

4

1 回答 1

2

您可以修改 ConnectionManager

public class ConnectionManager
{
  public IModel Channel { get; set; }
  public IConnection Connection { get; set; }

  private readonly ConnectionFactory _connectionFactory;

  public ConnectionManager()
  {
    _connectionFactory = SetupConnectionFactory();

    Connection = _connectionFactory.CreateConnection();
    Channel = Connection.CreateModel();
  }

  public IModel GetChannel()
  {
    return Channel;
  }
}
 <spring>
    <context>
      <resource uri="config://spring/objects"/>
    </context>
    <object name="connectionManager" type="Epex.ConnectionManager, EpexData" singleton="true"/>

    <object name="consumer" type="Epex.Consumer, EpexData">
      <constructor-arg>
        <object factory-object="connectionManager" factory-method="GetChannel" />
      </constructor-arg>
    </object>
</spring>
于 2012-08-21T06:13:28.373 回答