2012-08-17 61 views
0

以下問題:由其他依賴創建的對象的.NET .NET構造器注入

我正在開發一個使用RabbitMQ連接到API的WCF服務。我們使用彈簧作爲DI容器。

我們做了一個消費類(兔MQ +記錄一些自定義邏輯)

下調版本:


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> 

那麼我放在做一些時髦嗎?

我們也可以重寫,並在消費者(最後選項)注入的ConnectionManager

+0

一種解決方案張貼在這裏http://stackoverflow.com/問題/ 6739899/spring-net-propertyretrievingfactoryobject-property-is-null。您可以在SpEL中使用「PropertyRetrievingFactoryObject」或表達式。文檔:http://www.springframework.net/doc-latest/reference/html/objects.html#objects-advancedproperty-setting – Andreas 2012-08-18 12:52:06

回答

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>