想象一下,您有一個Web站點,每個用戶都可以將代碼放入一個框中,然後按「搜索」以查找有關產品的信息。該代碼將匹配模式:SHOPNAME-PROGRESSIVENUMBER
,例如:EVERYDAYSHOES-002
或NEWGAMES-005
。如何正確使用依賴注入來管理這種情況
當用戶按下「搜索」按鈕,我的代碼:
- 識別店
- 得到一個連接字符串連接到一個數據庫,這是每家店鋪不同
- 調用使用該連接字符串在該數據庫上進行查詢。
是來到我的腦海裏做到這一點的第一件事,就是代碼的東西,如:
public interface IProductInformationsProvider
{
string GetProductName(int productCode);
}
public class SQLProductInformationsProvider : IProductInformationsProvider
{
...
public SQLProductInformationsProvider(
string connectionString,
ILogService logService)
{
...
}
public string GetProductName(int productCode)
{
...
}
}
要獲得IProductInformationsProvider
的istance我會用一個DI容器和做一些事情,如:
...
public void SearchButtonHandler(Dictionary<string, string> shopsConnectionStringsMap)
{
using (var container = new WindsorContainer())
{
container.Register(
Component.For<ILogService>()
.ImplementedBy<ConsoleLogService>());
container.Register(
Component.For<IProductInformationsProvider>()
.ImplementedBy<SQLProductInformationsProvider>()
.DependsOn(
Dependency.OnValue("connectionString", shopsConnectionStringsMap[parsedShopName]));
var productInformationsProvider = container.Resolve<IProductInformationsProvider>();
var productName = productInformationsProvider.GetProductName(theCode);
// Do something with productName
}
}
我的問題是:
- 它是好還是壞(以及爲什麼)做註冊 - 解決我的按鈕上的每一次點擊?
- 如果不好,我該如何重構這個模型以適應DI模式?
對於第二個問題,我想:
就叫解決每個按鈕覆蓋
connectionString
點擊解決所有可能的
SQLProductInformationsProvider
,在字典高速緩存它們,並使用所需的一個從構造函數中刪除
connectionString
並將其放在方法SetConnectionString(string connectionString)
,但在這種情況下,我將不得不擔心線程安全問題。
所有這三個想法都不滿足我,他們給我的感覺我誤解了一些東西。我錯過了什麼/我該如何改變我的觀點?
使用容器先註冊具體類型,然後在第二天線解決就沒有意義了。容器在這裏引入了什麼值,而不是在這兩種類型上調用'new'? –
你是如何傳遞'_shopsConnectionStringsMap'?通過構造函數?你現在可以展示構造函數的外觀嗎? –