我使用的工作单元/通用存储库模式几乎与the example Microsoft provides完全相同,而且效果很好。但是,最近出现了一些仅适用于特定类型的存储库的方法。
例如,假设我有两个与数据库表对应的类:People
和Spaceships
。
unitofwork.People
是Repository<Person>
,unitofwork.Spaceships
是Repository<Spaceship>
。虽然两个存储库都有我在
public class Repository<TEntity> where TEntity : class, IEntity
如果我想在Person
上使用某些unitofwork.People
具体方法,该怎么办?这可能吗?
答案 0 :(得分:2)
你可以使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);
}