추상 클래스의 사용과 결합 된 저장소 패턴의 문제가 발생합니다.저장소 패턴 및 추상 클래스의 문제점
나는 추상 형식의 ICollection을 반환하는 단일 메서드를 구현하는 저장소가 있습니다.
public class Country : Location
{
public override string Name { get; set; }
public override LocationType Type { get { return LocationType.Country; } }
}
여기 내 저장소입니다 :
public class LocationsRepository : Locations.Repository.ILocationsRepository
{
public ICollection<Location> GetAllLocations()
{
Country america = new Country { Name = "United States" };
Country australia = new Country { Name = "Australia" };
State california = new State { Name = "California", Country = america };
return new List<Location>() { america, australia, california };
}
}
이
여기
public abstract class Location
{
public abstract string Name { get; set; }
public abstract LocationType Type { get; }
}
그 추상 클래스의 콘크리트 구현의 :
은 여기 내 추상적 인 클래스의
지금까지 모두 좋았습니다.
지금 서비스 :
public class CountryService : ICountryService
{
private ILocationsRepository repository;
public CountryService()
{
// in reality this is done by DI, but made 'greedy' for simplicity.
this.repository = new LocationsRepository();
}
public List<Country> GetAllCountries()
{
// errors thrown by compiler
return repository.GetAllLocations()
.Where(l => l.Type == LocationType.Country)
.ToList<Country>();
}
}
문제가있다. 나는 추상적 인 유형의 ICollection<T>
을 반환하는 저장소에서 구체적인 유형의 목록 (Country
)을 반환하려고합니다.
2 컴파일 타임 오류를 가져 오기 :
'System.Collections.Generic.IEnumerable' 'ToList'최고의 확장 메서드 오버로드 '을 System.Linq에 대한 정의가 포함되어 있지 않습니다. ParallelEnumerable.ToList (System.Linq.ParallelQuery)는 '일부 잘못된 인수가
및
인스턴스 인수 : 에서 'System.Collections.Generic.IEnumerable' 'System.Linq.ParallelQuery'
그래서
, 내가 어떻게 구현할 수 이 패턴을 변환 할 수 없습니다?
나는 추상적 인 형식을 인스턴스화 할 수 없다는 점을 이해할 수 있으므로 열거 자 (.ToList)가 인스턴스화하려고 시도하므로 오류가 발생합니까? 당신이하려고 어떤 메신저 이해하지 못하는 경우
:
이- 내가 원하는 내 저장소를
- 가 내 서비스를 원하는 추상적 인 유형의
ICollection<T>
을 반환 (내가 각 콘크리트를해야합니다 형식)을 반환하는 단일 저장소 메서드를 기반으로 구체적인 형식 목록
LINQ 구문의 경우입니까? 아니면 내 디자인 패턴이 완전히 틀렸어?난 당신이 목록을 생성 할 수있는에 일반 ToList<T>
방법을 착각 한 생각
return repository.GetAllLocations()
.Where(l => l.Type == LocationType.Country)
.Select(l => l as Country).ToList();
:
는 문제에 대한 해결책은 아주 간단합니다
+1 그게 최선의 해결책입니다. –
굉장했기 때문에 LINQ 문제 였고 추상적/저장소 문제는 아닙니다. 감사!! – RPM1984