IRepository
패턴을 사용하여 데이터 계층을 구현했습니다.서비스 계층에 대한 Entity Framework 확장자 표시
public virtual IQueryable<TEntity> Queryable()
{
return dbSet;
}
나는 또한 필터링 예를 들어 공급이 메소드를 호출 서비스 계층이 : 이러한 방법 중 하나는 IQueryable
반환 지금까지 너무 좋아
public User GetByName(string name)
{
return _repository.Queryable()
.Where(a => a.Name == name)
.ToList();
}
을, 엔티티 프레임 워크는 데이터 만에서 참조 계층에서, 서비스 계층은 이것에 대해 아무 것도 모른다.
- 사용
그래서 지금 내 서비스 방법은 다음과 같이 보이는 Include
방법
ToListAsync()
방법 : 지금, 그러나 나는 두 가지 추가 작업을 수행 할 public async Task<User> GetByName(string name)
{
return await _repository.Queryable()
.Where(a => a.Name == name)
.Include(x => x.Pets)
.ToListAsync();
}
이제 문제는 Include()
및 ToListAsync()
은 모두 인 System.Data.Entity
네임 스페이스에 있습니다.
내 서비스 계층 내에서 EF를 참조하고 싶지는 않지만 신경 쓰지 않아야합니다. 그러나이 문제를 해결하는 방법을 알지 못하고 아키텍처를 깨끗하게 유지할 수 없습니다. 내가 볼 수있는 유일한 해결 방법은 다음과 같습니다
- 이
IRepository<User>' and handles the two additional methods required. The service will then take use an instance of this rather than
IRepository` 랩 데이터 층 (UserData
)에 새 클래스를 추가 계층에게 - 서비스를 제공하는 엔티티 프레임 워크를 추가합니다.
모범 사례를 준수하면서 어떻게 해결할 수 있을지 제안 해주세요.
비즈니스 레이어가 자체 쿼리를 작성할 수있는 호출을 노출하려는 경우 EF 추상화의 요점을 이해하지 못합니다. 그것은 저장소가 나에게 쓸데없는 것 같은 느낌을 갖게합니다. 실제로 질문과 관련이 없지만 논리가 무엇인지 궁금합니다. – Jonesopolis
'Include' 부분이 정말로 저장소에 있어야한다고 생각합니다. 본질적으로 리포지토리는 개체 그래프 측면에서 무엇을 반환해야하는지 알고 있어야하며 이러한 작업은 모든 유스 케이스의 비즈니스 요구를 지원해야합니다. 'ToListAsync'가 EF 외부에 있다면 좋을 것 같습니다. EF 밖에서도 이해가되는지 알기 위해 구현에 대해 충분히 알지 못합니다. – David
"최상의 실습"을 제외하고 리포지토리를 정확히 사용하는 이유는 무엇입니까? 어쩌면 결과 또는 뭔가를 캐시하려고 할 것입니다. – Evk