새 앱에 대한 일반 리포지토리를 만드는 이점에 대한 기사를 읽었습니다 ( 예 ). 동일한 저장소를 사용하여 여러 엔티티 유형에 대해 여러 가지 작업을 한 번에 수행 할 수 있기 때문에 아이디어가 좋습니다.
IRepository repo = new EfRepository(); // Would normally pass through IOC into constructor
var c1 = new Country() { Name = "United States", CountryCode = "US" };
var c2 = new Country() { Name = "Canada", CountryCode = "CA" };
var c3 = new Country() { Name = "Mexico", CountryCode = "MX" };
var p1 = new Province() { Country = c1, Name = "Alabama", Abbreviation = "AL" };
var p2 = new Province() { Country = c1, Name = "Alaska", Abbreviation = "AK" };
var p3 = new Province() { Country = c2, Name = "Alberta", Abbreviation = "AB" };
repo.Add<Country>(c1);
repo.Add<Country>(c2);
repo.Add<Country>(c3);
repo.Add<Province>(p1);
repo.Add<Province>(p2);
repo.Add<Province>(p3);
repo.Save();
그러나 나머지 리포지토리 구현은 Linq에 크게 의존합니다.
IQueryable<T> Query();
IList<T> Find(Expression<Func<T,bool>> predicate);
T Get(Expression<Func<T,bool>> predicate);
T First(Expression<Func<T,bool>> predicate);
//... and so on
이 리포지토리 패턴은 Entity Framework에서 훌륭하게 작동했으며 DbContext / DbSet에서 사용 가능한 메소드의 1 대 1 매핑을 거의 제공했습니다. 그러나 Entity Framework 외부의 다른 데이터 액세스 기술에 대한 Linq의 느린 채택으로 인해 DbContext와 직접 작업하는 것보다 어떤 이점이 있습니까?
PetaPoco 버전의 리포지토리 를 작성하려고 시도 했지만 PetaPoco는 Linq Expressions를 지원하지 않으므로 기본 GetAll, GetById, Add, Update, Delete 및 Save에만 사용하지 않는 한 일반 IRepository 인터페이스를 만드는 것은 거의 쓸모가 없습니다. 기본 클래스로 사용하십시오. 그런 다음 이전에 술어로 전달할 수있는 모든 "where"절을 처리하기 위해 특수한 메소드를 사용하여 특정 저장소를 작성해야합니다.
일반 리포지토리 패턴이 Entity Framework 외부에 유용한가요? 그렇지 않다면 누군가 Entity Framework와 직접 작업하는 대신 왜 전혀 사용하지 않습니까?
원본 링크에는 샘플 코드에서 사용한 패턴이 반영되어 있지 않습니다. 여기에 ( 업데이트 된 링크 )가 있습니다.