向泛型类添加非泛型方法

时间:2014-02-05 16:25:18

标签: c# asp.net-mvc entity-framework generics repository

我使用的工作单元/通用存储库模式几乎与the example Microsoft provides完全相同,而且效果很好。但是,最近出现了一些仅适用于特定类型的存储库的方法。

例如,假设我有两个与数据库表对应的类:PeopleSpaceships

unitofwork.PeopleRepository<Person>unitofwork.SpaceshipsRepository<Spaceship>。虽然两个存储库都有我在

中定义的方法
public class Repository<TEntity> where TEntity : class, IEntity

如果我想在Person上使用某些unitofwork.People具体方法,该怎么办?这可能吗?

1 个答案:

答案 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);
}