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