5

Soy bastante nuevo en el patrón de repositorio y la inyección de dependencia. Casi todos los patrones del repositorio que he encontrado tiene algún tipo de GetAll() de este modo:Patrón de repositorio con procedimientos almacenados

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

Estoy teniendo un problema implementación de este método GetAll() de la interfaz y porque yo estoy llamando a un procedimiento almacenado que requiere un parámetro que cambia en función de la entrada de un usuario. No deseo agregar un método ad-hoc a la interfaz del repositorio, p. IQueryable<T> GetAll(string input);. Asimismo, no quiero añadir un parámetro al constructor porque se ve un poco desordenado para mí:

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

También estoy usando la inyección de dependencia por lo que habría que añadir un poco de la entrada dinámica al constructor cuando se enlaza :

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

¿Alguna sugerencia?

ACTUALIZACIÓN:

me gustaría volver a utilizar la interfaz IRepository. Por ejemplo, en un programa estoy usando EF4 para implementar el método GetAll(), y en otro programa estoy usando ADO.NET estándar para llamar a un procedimiento almacenado como el ejemplo anterior.

+0

Su código se ve absolutamente bien y de acuerdo con el patrón de repositorio. –

Respuesta

5

Parece que GetAll no necesariamente está obteniendo todo. En ese caso, también puede cambiarle el nombre o tener otro método que describa con más precisión la funcionalidad ofrecida por su procedimiento almacenado que toma los parámetros de entrada apropiados que se pueden pasar al procedimiento.

+0

¿Eso significa que necesito agregar otro método a la interfaz del repositorio, p. 'IQueryable StoredProcedureMethod (entrada de cadena)'? Cuando llega el momento de reutilizar la interfaz del repositorio, existe una buena posibilidad de que StoredProcedureMethod() no se implemente. – jodev

+0

@jodev Depende de lo que realmente está haciendo su SP: parece que devuelve un subconjunto de todos los registros. Siempre puede intentar abstraer las entradas teniendo GetAllMatches (criterios SomeMatchingObject). Es difícil hacer más comentarios sin saber lo que hace el SP. –

+0

gracias. Estoy devolviendo un subconjunto, por lo que tiene sentido que otro método como usted sugiera que debe manejar la llamada. – jodev

3

Sugiero que si está utilizando GetAll con un procedimiento almacenado, está perdiendo el sentido.

El ejemplo de GetAll que devuelve un IQueryable infiere la ejecución de la demora de alguna forma, pero si está realizando una llamada a un procedimiento almacenado, la ejecución no se retrasará.

Sugeriría mantener la función GetAll, pero como una llamada al contexto de su ORM. Las llamadas que tienen que los procedimientos almacenados, tenga como métodos separados, pero vuelven algo así como IList<Entity>

+0

Gracias por la respuesta. Modifiqué mi publicación Utilizaré el método GetAll() para procedimientos almacenados y el 'DbContext' de EF4. – jodev

5

no puede usted añadir un nuevo método en su IRepository para ejecutar procedimiento almacenado personalizado:

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

y en su Implementación (ConcreteRepository) puede poner esta lógica en:

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