2 回答
TA贡献1836条经验 获得超5个赞
在接口和抽象类中具有相同的类型参数并不是什么大问题。使用您的抽象类解决方案是可以的,除非您ProductRepository需要从其他类继承。
实际上,对于您的抽象类,您的IRepository接口不再需要存在。只需处理一切BaseRepository!
这个问题的另一个解决方案是扩展方法。在静态类中,你可以这样写:
public static void Create<TEntity, TPrimaryKey>(this IRepository<TEntity, TPrimaryKey> repo, IEnumerable<TEntity> entities) where TEntity : class {
// do your foreach loop here
}
现在你可以IRepository像这样在任何实例上调用这个方法:
repository.Create(...);
TA贡献2003条经验 获得超2个赞
这就是我要做的方式。我会打破之间的继承IRepository和IProductRepository:
这是您的接口:
public interface IRepository<TEntity, TPrimaryKey> where TEntity : class
{
TEntity FindById(TPrimaryKey id);
void Create(TEntity entity);
void Delete(TEntity entity);
void Create(IEnumerable<TEntity> entities);
}
internal interface IProductRepository
{
void SomeProductRepoMethod(int someParam);
}
然后让你的基类继承IRepository你所做的:
基类:
public abstract class BaseRepository<TEntity, TPrimaryKey> :
IRepository<TEntity, TPrimaryKey> where TEntity : class
{
public abstract TEntity FindById(TPrimaryKey id);
public abstract void Create(TEntity entity);
public abstract void Delete(TEntity entity);
public void Create(IEnumerable<TEntity> entities)
{
foreach (TEntity entity in entities)
{
Create(entity);
}
}
}
然后你派生你的基类并实现你的IProductRepository:
public class ProductRepository : BaseRepository<Product, int>, IProductRepository
{
public override Product FindById(int id)
{
// find
}
public override void Create(Product product)
{
// save
}
public void SomeProductRepoMethod(int someParam)
{
// do product repository specific stuff
}
public override void Delete(Product entity)
{
// delete
}
}
我认为您的派生类作为Product存储库的特殊性是BaseRepository.
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报