2016-09-03 15 views
1

想象一下,您有一個Web站點,每個用戶都可以將代碼放入一個框中,然後按「搜索」以查找有關產品的信息。該代碼將匹配模式:SHOPNAME-PROGRESSIVENUMBER,例如:EVERYDAYSHOES-002NEWGAMES-005如何正確使用依賴注入來管理這種情況

當用戶按下「搜索」按鈕,我的代碼:

  1. 識別店
  2. 得到一個連接字符串連接到一個數據庫,這是每家店鋪不同
  3. 調用使用該連接字符串在該數據庫上進行查詢。

是來到我的腦海裏做到這一點的第一件事,就是代碼的東西,如:

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 
    } 
} 

我的問題是:

  1. 它是好還是壞(以及爲什麼)做註冊 - 解決我的按鈕上的每一次點擊?
  2. 如果不好,我該如何重構這個模型以適應DI模式?

對於第二個問題,我想:

  1. 就叫解決每個按鈕覆蓋connectionString點擊

  2. 解決所有可能的SQLProductInformationsProvider,在字典高速緩存它們,並使用所需的一個

  3. 從構造函數中刪除connectionString並將其放在方法SetConnectionString(string connectionString),但在這種情況下,我將不得不擔心線程安全問題。

所有這三個想法都不滿足我,他們給我的感覺我誤解了一些東西。我錯過了什麼/我該如何改變我的觀點?

+0

使用容器先註冊具體類型,然後在第二天線解決就沒有意義了。容器在這裏引入了什麼值,而不是在這兩種類型上調用'new'? –

+0

你是如何傳遞'_shopsConnectionStringsMap'?通過構造函數?你現在可以展示構造函數的外觀嗎? –

回答

2

我想到了一個解決辦法是:

public interface IProductInformationsProvider 
{ 
    string GetProductName(int productCode); 
} 

public interface IConnectionStringProvider 
{ 
    string GetConnectionString(string shopName); 
} 

public class SQLProductInformationsProvider : IProductInformationsProvider 
{ 
    ... 

    public SQLProductInformationsProvider(
     IConnectionStringProvider connectionStringProvider, 
     ILogService logService) 
    { 
     ... 
    } 

    public string GetProductName(string shopName, int productCode) 
    { 
     string connectionString = connectionStringProvider.GetConnectionString(shopName); 
     ... 
    } 
} 

public void SearchButtonHandler(string shopName, int Code) 
{ 
    // _productInformationsProvider already resolved 
    var productName = _productInformationsProvider.GetProductName(shopName, Code); 
    // Do something with productName 
} 
相關問題