2017-03-15 9 views
0

다른 DB 컨텍스트를 사용하는 다른 모듈에서 사용할 인터페이스로 구현되는 일반 데이터 액세스 레이어가 있습니다. 여기 일반 데이터 액세스 레이어에서 매개 변수로 dbcontext를 전달하는 방법

코드입니다 :

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class 
{ 



    public virtual IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions) 
    { 
     List<T> list; 
     using (var context = new _DbContext()) 
     { 
      IQueryable<T> dbQuery = context.Set<T>(); 
      if (includePaths != null) 
      { 
       for (var i = 0; i < includePaths.Count(); i++) 
       { 
        dbQuery = dbQuery.Include(includePaths[i]); 
       } 
      } 
      if (filter != null) 
      { 
       dbQuery = dbQuery.Where(filter).AsQueryable(); 
      } 
      IOrderedEnumerable<T> orderedQuery = null; 
      for (var i = 0; i < sortExpressions.Count(); i++) 
      { 
       if (i == 0) 
       { 
        if (sortExpressions[i].SortDirection == ListSortDirection.Ascending) 
        { 
         orderedQuery = dbQuery.OrderBy(sortExpressions[i].SortBy); 
        } 
        else 
        { 
         orderedQuery = dbQuery.OrderByDescending(sortExpressions[i].SortBy); 
        } 
       } 
       else 
       { 
        if (sortExpressions[i].SortDirection == ListSortDirection.Ascending) 
        { 
         orderedQuery = orderedQuery.ThenBy(sortExpressions[i].SortBy); 
        } 
        else 
        { 
         orderedQuery = orderedQuery.ThenByDescending(sortExpressions[i].SortBy); 
        } 
       } 
       dbQuery = orderedQuery.AsQueryable(); 
      } 
      dbQuery = dbQuery.Skip(((int)page - 1) * (int)pageSize); 
      dbQuery = dbQuery.Take((int)pageSize); 

      list = dbQuery 
      .ToList<T>(); 

     } 
     return list; 

    } 
} 

이 GenericDataRepository 계층에서, 나는 DB 컨텍스트 클래스가 없습니다. 이 GenericDataRepository가 DB 컨텍스트를 다른 호출 모듈에서 들어오는 매개 변수로 받아 들여 Get 메서드에서 작성된 작업을 수행하기를 원합니다.

내가 방법을 점점
using (var context = new _DbContext())
을 사용하여 볼 수 있습니다. 이 목표를 달성하기 위해 GenericDataRepository를 작성하는 방법을 모르겠습니다.

이 내 인터페이스

public interface IGenericDataRepository<T> where T : class 
{ 


    IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions); 
     } 
} 
+0

:

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class { private readonly Func<DbContext> _contextFactory; public GenericDataRepository(Func<DbContext> contextFactory) { _contextFactory = contextFactory; } public virtual IList<T> Get(Func<T, bool> filter, int page, int pageSize, string[] includePaths = null, params SortExpression<T>[] sortExpressions) { List<T> list; using (var context = contextFactory()) { //... } } } 

일반 데이터 저장소를 사용하는 층 Dbcontext에 액세스 할 수 있다고 가정하면, 그들은 이제 다음의 방식으로 저장소를 인스턴스화 할 저장소가 메소드 당 컨텍스트를 사용하는 것은 드문 경우입니다. 저장소 별 컨텍스트도 있습니다. 일반적으로 리포지토리는 포괄적 인 작업 단위 (UOW)의 컨텍스트에서 작동합니다. 컨텍스트를 주입하는 방법에 대한 더 큰 그림에 달려 있습니다. 귀하의 질문에 답변하기에는 너무 좁습니다. –

+0

나는 다른 저장소를 위해 CRUD opetation에 대한 저장소의 작업 인 일반 저장소를 사용하고 있습니다. 모든 모듈은 saperate db 컨텍스트를 솔루션의 differenet 모듈을 가지고있다 –

+0

그냥 Get 메서드에'DbContext' 매개 변수를 추가하십시오. –

답변

0

종속성 반전 원리를 사용합니다. 클래스 생성자에서 DbContext 팩토리를 삽입하십시오. 컨텍스트에 직접 액세스하는 대신 팩토리를 사용하여 컨텍스트를 작성하고 처리하십시오. 여기

거친 샘플이다

var repository = new GenericDataRepository<SomeType>(DbContextfactory); 
public void DbcontextFactory() 
{ 
    return new _DbContext(); 
} 
+0

이제 내 context.Set : contextFactory는 –

+0

집합의 메서드를 포함하지 않지만 다른 레이어 에서이 저장소를 호출 할 수 없습니다 –

+0

왜 안돼? 오류가 무엇입니까? –