2015-10-18 29 views
0

如何傳遞,注入或實例化一個對象的一個​​或多個實例,並只引用它的接口?如何在方法調用中傳遞或注入未知數量的對象

我不確定如果我正確地問這個,這是我的簡單的僞代碼問題。

在這個例子中,這是一個數據層,可以訪問對包含公共接口的項目的引用,但不能訪問具體的實現。我想傳入(或注入)將返回一個或多個提供者對象集合的List。

問題是,我無法爲存儲過程返回的集合中的每條記錄實例化一個IProvider項目的新實例,因爲我只參考了IProvider接口。

DI會解決這個問題嗎?我仍然不知道有多少個Provider項目要傳入,如果有的話在我調用這個方法的時候。

我有一種感覺,這是一個模式問題比什麼都重要,但我無法圍繞正確的解決方案包裹我的頭。

public List<IProvider> GetProviders(List<IProvider> providers, IProvider provider) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "Providers.usp_GetProviders"; 

     SQLDatabase db = new SQLDatabase(); 

     using(cmd.Connection = db.GetConnection()) 
     { 

      cmd.Connection.Open(); 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      if (rdr.HasRows) 
      { 
       // Internal private method called for each row 
       // needs a new instance of an IProvider 
       MapDbToEntity(rdr, provider); 
       providers.Add(provider); 
      } 
     } 

     return providers; 
    } 
+0

你將傳遞類的實例繼承來自IProvider並提供實現 –

+0

@EhsanSajjad是的,但我不知道我需要多少提供程序,我需要爲記錄集中的每一行創建一個新實例。完成這一模式正在逃避我。 – Richard

+0

爲了更加清晰,方法調用顯示了IProvider提供程序的參數 - 這可能不正確,但不知道如何在此方法內部解決此問題,我無法根據需要在此新建提供程序,然後填充並添加到集合中。 – Richard

回答

1

我認爲解決這個問題的正確方法是使用工廠模式。

實現接口來創建一個對象的工廠被注入到不知道任何關於實體的只有接口的較低數據層中。

我不是任何方式的模式專家,所以我正在尋找確認 - 這確實工作。

讓事情簡單:

namespace MyApplication.Common.Factory 
{ 
    public interface IFactory 
    { 
     IProvider GetProvider(); 
    } 
} 

然後,在我的業務實體層:

public class ProviderFactory : IFactory 
{ 
    public IProvider GetProvider() 
    { 
     return new Provider(); 
    } 

} 

這反過來又可以讓我起來了調用一個工廠來創建一個實例實現IProvider接口的對象:

public List<IProvider> GetProviders(List<IProvider> providers, IFactory factory) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "Providers.usp_GetProviders"; 

     SQLDatabase db = new SQLDatabase(); 

     using(cmd.Connection = db.GetConnection()) 
     { 

      cmd.Connection.Open(); 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      if (rdr.HasRows) 
      { 
       IProvider provider = factory.GetProvider(); 

       MapDbToEntity(rdr, provider); 
       providers.Add(provider); 
      } 
     } 

     return providers; 
    } 
相關問題