在this帖子中,我谈到了使用通用基类来创建存储库类,而不会重复加载基本的管道代码。
通过接口访问每个存储库。在下面的代码中,为了简洁起见,我只会展示其中一种方法:
接口
IQueryable<Suggestion> All { get; }
通用基类
public IQueryable<T> All
{
get { return _unitOfWork.GetList<T>(); }
}
具体类(实现接口并扩展通用基类)
public IQueryable<Suggestion> All
{
get { return _unitOfWork.GetList<Suggestion>(); }
}
我预计我将能够简单地从具体类中删除该方法,并且编译器将使用通用基类实现,并找出旨在满足该接口的方法。但不!
当我删除方法时,我得到旧的“没有实现接口成员”错误。
如果我不能这样做,我努力使用通用基类没有意义吗?或者有办法解决这个问题吗?
答案 0 :(得分:6)
您是否可以使接口本身具有通用性,然后在具体类中实现类型化版本?
public interface IRepository<T>
{
List<T> All { get; }
}
public class Repository<T>
{
public List<T> All
{
get { return new List<T>(); }
}
}
public class SuggestionRepository : Repository<Suggestion>, IRepository<Suggestion>
{ }
我仍然建议使用通用界面,因为这样可以避免重复自己,但这也有效。
public interface ISuggestionRepository
{
List<Suggestion> All { get; }
}
public class Repository<T>
{
public List<T> All
{
get { return new List<T>(); }
}
}
public class SuggestionRepository : Repository<Suggestion>, ISuggestionRepository
{ }
答案 1 :(得分:0)
使用virtual关键字并将您的界面放在具体实现上。
public interface IMyInterface<T>
{
IQueryable<T> All { get; }
}
public abstract class MyBaseClass<T> : IMyInterface<T>
{
public virtual IQueryable<T> All
{
get { return _unitOfWork.GetList<T>(); ; }
}
}
public class MyClass : MyBaseClass<Suggestion>, IMyInterface<Suggestion>
{
}