2 回答

TA貢獻1836條經(jīng)驗 獲得超5個贊
在接口和抽象類中具有相同的類型參數(shù)并不是什么大問題。使用您的抽象類解決方案是可以的,除非您ProductRepository需要從其他類繼承。
實際上,對于您的抽象類,您的IRepository接口不再需要存在。只需處理一切BaseRepository!
這個問題的另一個解決方案是擴展方法。在靜態(tài)類中,你可以這樣寫:
public static void Create<TEntity, TPrimaryKey>(this IRepository<TEntity, TPrimaryKey> repo, IEnumerable<TEntity> entities) where TEntity : class {
// do your foreach loop here
}
現(xiàn)在你可以IRepository像這樣在任何實例上調用這個方法:
repository.Create(...);

TA貢獻2003條經(jīng)驗 獲得超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);
}
}
}
然后你派生你的基類并實現(xiàn)你的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 關注
- 212 瀏覽
添加回答
舉報