1

我有一個應用程序使用幾個不同的數據庫連接。我想使用Castle Windsor的類型化工廠支持來注入一個工廠,該工廠將IDbConnection的實例返回到我的存儲庫和其他組件中。組件特定的城堡溫莎輸入工廠

下面是我的類型化廠的界面看起來的樣子:

public interface IConnectionFactory 
{ 
    IDbConnection CreateConnection(); 
} 

而且這裏有一個樣品庫:

public class AccountRepository 
{ 
    private readonly IConnectionFactory connectionFactory; 

    public AccountRepository(IConnectionFactory connectionFactory) 
    { 
     this.connectionFactory = connectionFactory; 
    } 

    public Account FindAccountById(int id) 
    { 
     using (var connection = connectionFactory.CreateConnection()) 
     { 
      // TODO use the connection here 
     } 
    } 
} 

我的組件註冊的摘錄:

// ... 

container.Register(Component.For<IDbConnection>() 
    .ImplementedBy<NpgsqlConnection>() 
    .LifestyleTransient()); 

container.Register(Component.For<IConnectionFactory>() 
    .AsFactory()); 

// ... 

我所有的IDbConnection都使用相同的類型(NpgsqlConnection),但我需要使用幾個不同的連接字符串。理想情況下,我想設置Windsor來設置連接字符串IDbConnection(或傳遞給連接構造函數),具體取決於具有IConnectionFactory作爲依賴項的組件。

例如:

  • 說我有兩個倉庫,AccountRepositoryItemRepository,即採取IConnectionFactory作爲它們的構造函數依賴。
  • 說我也有兩個連接字符串foobar
  • AccountRepository調用IConnectionFactory.CreateConnection(),我希望它使用連接字符串foo返回IDbConnection
  • 但是,當ItemRepository調用IConnectionFactory.CreateConnection()時,我希望它使用連接字符串bar返回IDbConnection

這是可能與溫莎城堡?

我已經研究了這個主題,但沒有找到適合我的確切場景的解決方案。理想情況下,我想保持我的無知庫確切的連接字符串中使用,即我做想我的連接工廠更改爲:

public interface IConnectionFactory 
{ 
    IDbConnection CreateConnection(string connectionStringName); 
} 

我也看到了所有的文件和我可以在ISubDependencyResolverITypedFactoryComponentSelector找到的文章,但我不確定它們是否適用於這種情況或如何將所有內容拼湊在一起。順便說一下,我使用的是Castle Windsor 3.1和.NET 4.0。

+1

將命名部件給你想要的是什麼?我想這會讓你在註冊時表達具體的依賴關係。 –

回答

0

也許使用一個真正的工廠,而不是一個類型之一:

public ConnectionAFactory : IConnectionFactory 
{ 
    public ConnectionAFactory() 
    { 
      this.connectionString = "foo"; 
    } 
} 

而且在溫莎與正確的存儲庫中註冊:

Component.For<AccountRepository>() 
    .DependsOn(
     ServiceOverride.ForKey<IConnectionFactory>().Eq(typeof(ConnectionAFactory)));