مرسی استاد
من یک ریپازیتوری عمومی نوشتم که هر بار نخام کدهای تکراری رو در هر ریپازیتوری بنویسم اما برای هر مدلی یک سری متدهای خاص هم هست .برای اونا که مجبور میشم ریپازیتوری تعریف کنم و بعد باید سرویسشون رو فعال کنم .
من کدها رو یه سری تغییر دادم بصورت زیر :
در واقع یک اینترفیس دارم بصورت زیر :
public interface IRepository<TEntity>
where TEntity : class
{
IEnumerable<TEntity> GetAll();
TEntity GetById(int id);
void Add(TEntity entity);
void Update(int id, TEntity entity);
void Delete(int id);
IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate);
}
یک ریپازیتوری عمومی :
public abstract class RepositoryBase<TEntity> : IRepository<TEntity>
where TEntity : class
{
private readonly DataContext _dbContext;
public RepositoryBase(DataContext dbContext)
{
_dbContext = dbContext;
}
public IEnumerable<TEntity> GetAll()
{
return _dbContext.Set<TEntity>().ToList();
// return _dbContext.Set<TEntity>().AsNoTracking();
}
public TEntity GetById(int id)
{
return _dbContext.Set<TEntity>().Find(id);
}
public void Add(TEntity entity)
{
_dbContext.Set<TEntity>().Add(entity);
}
public void Update(int id,TEntity entity)
{
_dbContext.Entry(entity).State = EntityState.Modified;
}
public void Delete(int id)
{
TEntity entity = _dbContext.Set<TEntity>().Find(id);
if (entity != null) _dbContext.Set<TEntity>().Remove(entity);
}
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return _dbContext.Set<TEntity>().Where(predicate).ToList( );
}
}
برای متد savechange هم بصورت زیر :
public interface IUnitOfWork : IDisposable
{
int Save();
}
و
public class UnitOfWork : IUnitOfWork
{
private readonly DataContext _dbContext;
public UnitOfWork(DataContext dbContext)
{
_dbContext = dbContext;
}
public int Save()
{
return _dbContext.SaveChanges();
}
#region IDisposable Support
private bool disposedValue;
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
_dbContext.Dispose();
}
disposedValue = true;
}
}
void IDisposable.Dispose()
{
Dispose(true);
}
}
حالا هر مدلی رو که بخام متد اضافه تری هم داشته باشن از RepositoryBase ارث میبرن . و مجبور میشم مدام در استارت آپ سرویسشون رو فعال کنم . و اگر درست متوجه شده باشم شما میگین که برای اون متدهای خاص یه IQueryable داشته باشم در ریپازیتوری بیس ؟که نخام برای هر مدل ریپازیتوری بنویسم و سرویس هم نمیخاد فعال شه.
public virtual IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null)
{
IQueryable<TEntity> query = _dbContext.Set<TEntity>(); ;
if (filter != null)
query = query.Where(filter);
if (orderBy != null)
query = orderBy(query);
return query;
}