2014-02-05 2 views
0

저는 작업 단위/일반 저장소 패턴을 the example Microsoft provides과 거의 동일하게 사용하고 있습니다. 그러나 최근에는 특정 유형의 저장소에만 적용 가능한 일부 방법에 대한 필요성이 제기되었습니다.일반 클래스에 비 제너릭 메소드 추가

예를 들어 데이터베이스 테이블에 해당하는 클래스가 두 개 있다고 가정 해 보겠습니다. PeopleSpaceships입니다.

unitofwork.PeopleRepository<Person>이고, unitofwork.SpaceshipsRepository<Spaceship>입니다. 두 저장소는 방법을 가지고 있지만 나는 어떤 Person - 특정 방법이 unitofwork.People에 사용할 수 원하는 경우

public class Repository<TEntity> where TEntity : class, IEntity 

에 정의? 이것이 가능한가?

+0

여기에는 일반적인 하나 크기에 맞는 모든 클래스의 아이디어가 실패하는 곳이 있습니다. 관심사를 분리하고 리포지토리와 별도로 쿼리 클래스를 만듭니다. – trailmax

답변

2

Repository<T>을 추상 클래스로 만들 수 있습니다. 당신이 기본 저장소의 인스턴스를 초기화 할 수있게하려면이,

unitofwork.People = new PeopleRepository(); 
unitofwork.People.Add(new Person()); // Can access the base class 
Console.WriteLine(unitofwork.People.GetPersonName()); // People-specific methods 
unitofwork.Spaceships = new SpaceshipRepository(); 

:

abstract class RepositoryBase<TEntity> where TEntity : class, IEntity { 
    void Add(TEntity entity); 
    ... 
} 

class PeopleRepository : RepositoryBase<Person> { 
    string GetPersonName(); 
} 

class SpaceshipRepository : RepositoryBase<Spaceship> { 
    void Fly(); 
} 

당신은 다음과 같이 클래스를 구현하는 것 : 그런 다음 각 엔티티 해야 자신의 구현을

class Repository<TEntity> where TEntity : class, IEntity { 
    void Add(TEntity entity); 
} 

class PeopleRepository : Repository<Person> { 
    string GetPersonName(); 
} 

당신이 자신의 저를 제공하는 것을 PeopleRepository을 중지하려면 : abstract로 표시 할 필요가 없습니다 그런 다음 sealed 수정자를 사용할 수 있습니다.

class Repository<TEntity> where TEntity : class, IEntity { 
    sealed protected void Add(TEntity entity); 
} 
+0

예! 나는 이런 것을 알고있었습니다. 그 이름이 무엇인지 기억하지 못했습니다. 추상. 고맙습니다! – Andrew

+0

사실, 나는 추상적 인 것을 원하지 않습니다. 왜냐하면 저는 다른 유형의 메소드가 필요 없다고 언급하지 않았기 때문에 일반적인 저장소를 인스턴스화하려고합니다. 내가 원했던 것은 클래스를 상속하는 것이 었습니다. 나는 그것을 열심히 생각하고 있었다. – Andrew

+0

당신의 대답에서 "선택적"이란 단어가 기술적으로 부정확하다는 뜻입니다. 기본 클래스가'abstract' 인 경우 각 엔티티가 자체 구현을 가져야합니다. – Andrew

관련 문제