5

저는 저장소 패턴과 종속성 삽입을 처음 접했습니다. 거의 내가 건너 한 모든 저장소 패턴과 같이 GETALL() 메소드의 어떤 종류가 있습니다저장 프로 시저가있는 저장소 패턴

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

내가 저장 프로 시저를 호출하고 있기 때문에이 인터페이스와 GETALL() 메소드를 구현하는 문제에 봉착를 그 사용자의 입력에 따라 변경되는 매개 변수가 필요합니다. 예를 들어 저장소 인터페이스에 ad-hoc 메서드를 추가하고 싶지 않습니다. 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(?) 

의견이 있으십니까?

업데이트 : 내가 IRepository 인터페이스를 다시 사용할 수 있도록

. 예를 들어, 한 프로그램에서 EF4를 사용하여 GetAll() 메서드를 구현하고 다른 프로그램에서는 표준 ADO.NET을 사용하여 위의 예제와 같은 저장 프로 시저를 호출합니다.

+0

코드는 절대적으로 그리고 repostitory 패턴에 따라 절대적으로 보인다. –

답변

5

GetAll이 반드시 모두를 얻는 것은 아닙니다. 어떤 경우에는 프로 시저에 전달할 수있는 적절한 입력 매개 변수를 사용하는 스토어드 프로 시저가 제공하는 기능을보다 정확하게 설명하는 이름을 바꾸거나 다른 방법을 사용할 수도 있습니다.

+0

다른 방법을 저장소 인터페이스에 추가해야한다는 것을 의미합니까? 예 : 'IQueryable StoredProcedureMethod (문자열 입력)'? 저장소 인터페이스를 재사용 할 때가되면 StoredProcedureMethod()가 구현되지 않을 가능성이 큽니다. – jodev

+0

@jodev 귀하의 SP가 실제로하는 일에 달려 있습니다 - 그것은 모든 레코드의 하위 집합을 반환하는 것처럼 들립니다. GetAllMatches를 입력하여 언제든지 입력을 시도하고 추상화 할 수 있습니다. (SomeMatchingObject 기준). SP가하는 일을 모른 채 더 이상 논평하기는 어렵습니다. 덕분에 –

+0

. 하위 집합을 반환하므로 사용자가 제안한 다른 메서드에서 호출을 처리해야합니다. – jodev

3

GetAll을 저장 프로 시저와 함께 사용하는 경우 그 점이 누락되었습니다.

IQueryable을 반환하는 GetAll 예제는 어떤 형태로든 지연 실행을 유추하지만 저장 프로 시저를 호출하면 실행이 지연되지 않습니다.

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); 
     } 
관련 문제