我有一個應用程序使用幾個不同的數據庫連接。我想使用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
作爲依賴項的組件。
例如:
- 說我有兩個倉庫,
AccountRepository
和ItemRepository
,即採取IConnectionFactory
作爲它們的構造函數依賴。 - 說我也有兩個連接字符串
foo
和bar
。 - 當
AccountRepository
調用IConnectionFactory.CreateConnection()
,我希望它使用連接字符串foo
返回IDbConnection
。 - 但是,當
ItemRepository
調用IConnectionFactory.CreateConnection()
時,我希望它使用連接字符串bar
返回IDbConnection
。
這是可能與溫莎城堡?
我已經研究了這個主題,但沒有找到適合我的確切場景的解決方案。理想情況下,我想保持我的無知庫確切的連接字符串中使用,即我做不想我的連接工廠更改爲:
public interface IConnectionFactory
{
IDbConnection CreateConnection(string connectionStringName);
}
我也看到了所有的文件和我可以在ISubDependencyResolver
和ITypedFactoryComponentSelector
找到的文章,但我不確定它們是否適用於這種情況或如何將所有內容拼湊在一起。順便說一下,我使用的是Castle Windsor 3.1和.NET 4.0。
將命名部件給你想要的是什麼?我想這會讓你在註冊時表達具體的依賴關係。 –