您可以使Repository<T>
为抽象类。然后,每个实体必须有自己的实现:
abstract class RepositoryBase<TEntity> where TEntity : class, IEntity {
void Add(TEntity entity);
...
}
class PeopleRepository : RepositoryBase<Person> {
string GetPersonName();
}
class SpaceshipRepository : RepositoryBase<Spaceship> {
void Fly();
}
你会然后实现类为:
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 Repository<TEntity> where TEntity : class, IEntity {
void Add(TEntity entity);
}
class PeopleRepository : Repository<Person> {
string GetPersonName();
}
如果你想从提供自己的我停止PeopleRepository
那么你可以使用sealed
修饰符:
class Repository<TEntity> where TEntity : class, IEntity {
sealed protected void Add(TEntity entity);
}
这就是使用通用一致通用类的想法失败的地方。分开您的疑虑并为您的存储库单独创建查询类。 – trailmax