5

我對存儲庫模式和依賴注入非常陌生。幾乎所有的倉庫模式我已經遇到了某種GETALL()方法,像這樣:存儲過程的存儲庫模式

public interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
    // other CRUD methods here... 
} 

我有一個問題,實現了這個接口和GETALL()方法,因爲我調用存儲過程需要一個根據用戶輸入而改變的參數。我不想在存儲庫接口中添加一個臨時方法,例如IQueryable<T> GetAll(string input);。我也不想參數添加到構造,因爲它看起來有點凌亂的對我說:

public class ConcreteRepository : IRepository<Entity> 
{ 
    string _storedProcedureInput; 

    public ConcreteRepository(string storedProcedureInput) 
    { 
     _storedProcedureInput = storedProcedureInput; 

    public IQueryable<Entity> GetAll() 
    { 
     // Call to stored procedure goes here passing in the 
     // _storedProcedureInput variable. 
    } 
} 

我還使用依賴注入,所以我必須綁定時一些動態輸入要添加到構造:

Bind<IRepository<Entity>>().To<ConcreteRepository>().WithConstructorArgument(?) 

有什麼建議?

UPDATE:

我想重用IRepository接口。例如,在一個程序中,我使用EF4來實現GetAll()方法,而在另一個程序中,我使用標準的ADO.NET來調用上述示例中的存儲過程。

+0

你的代碼看起來完全沒問題,根據repostitory模式。 –

回答

5

這聽起來像你的GetAll不一定全部。在這種情況下,您可以重新命名它,或者使用另一種方法來更準確地描述存儲過程提供的功能,該功能可以將適當的輸入參數傳遞給過程。

+0

這是否意味着我需要將另一個方法添加到存儲庫接口,例如'IQueryable StoredProcedureMethod(string input)'?當重新使用存儲庫接口時,StoredProcedureMethod()將不會實現。 – jodev

+0

@jodev這取決於你的SP實際上在做什麼 - 它聽起來像是返回所有記錄的子集。您可以嘗試通過GetAllMatches (SomeMatchingObject條件)來抽象輸入。如果不知道SP的作用,很難進一步評論。 –

+0

謝謝。我正在返回一個子集,因此您的另一個方法建議應該處理該調用是有意義的。 – jodev

3

我建議,如果你正在使用GETALL與存儲過程你是一種缺少點。

GETALL的返回一個IQueryable推斷延遲執行某種形式的,但如果你正在爲一個存儲過程的執行將不會被推遲一個調用的例子。

我建議保持GETALL功能,但作爲一個電話到您的ORM的上下文。您必須將存儲過程的調用,繼續作爲單獨的方法,而是返回類似IList<Entity>

+0

感謝您的回覆。我修改了我的帖子。我將爲存儲過程和EF4的'DbContext'使用GetAll()方法。 – jodev

5

不能在你IRepository增加了一個新的方法來執行自定義存儲過程:

/// <summary> 
    /// Execute Stored Proc with result set returned. 
    /// </summary> 
    /// <param name="procName"></param> 
    /// <returns>An object resultset</returns> 
    T ExecuteCustomStoredProc<T>(string procName, SqlParameter params); 

,並在您實現(ConcreteRepository)你可以把這個邏輯它:

 public T ExecuteCustomStoredProc<T>(string commandName, SqlParameter params) 
     { 
      return this._repositoryContext.ObjectContext.ExecuteStoreQuery<T>(commandName, params); 
     }