ほぼ1年後、今回はバージョン4で新しいmvcプロジェクトを開始しています。次のリポジトリパターンの実装には利点よりも欠点の方が多いのではないかと思っていました。
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll();
IQueryable<T> Query(Expression<Func<T, bool>> filter);
void Add(T entity);
void Remove(T entity);
}
public interface IUnitOfWork
{
void Commit();
}
public interface IDbContext : IDisposable
{
IDbSet<T> Set<T>() where T : class;
int SaveChanges();
}
public class DbContextAdapter : IDbContext
{
private readonly DbContext _myRealContext;
public DbContextAdapter()
{
this._myRealContext = new EstafaContext();
}
public void Dispose()
{
_myRealContext.Dispose();
}
public IDbSet<T> Set<T>() where T : class
{
return _myRealContext.Set<T>();
}
public int SaveChanges()
{
return _myRealContext.SaveChanges();
}
}
public class SqlRepository<T> : IRepository<T> where T : class
{
private IDbSet<T> _dbSet;
public SqlRepository(IDbContext dbContext)
{
this._dbSet = dbContext.Set<T>();
}
public IEnumerable<T> GetAll()
{
return this._dbSet.ToList();
}
public IQueryable<T> Query(Expression<Func<T, bool>> filter)
{
return this._dbSet.Where(filter);
}
public void Add(T entity)
{
this._dbSet.Add(entity);
}
public void Remove(T entity)
{
this._dbSet.Remove(entity);
}
}
public class SqlUnitOfWork : IDisposable, IUnitOfWork
{
private IDbContext _dbContext;
private SqlRepository<Cliente> _clientes ;
public SqlUnitOfWork()
{
this._dbContext = new DbContextAdapter();
}
public void Dispose()
{
if (this._dbContext != null)
{
this._dbContext.Dispose();
}
GC.SuppressFinalize(this);
}
public IRepository<Cliente> Clientes
{
get { return _clientes ?? (_clientes = new SqlRepository<Cliente>(_dbContext)); }
}
public void Commit()
{
this._dbContext.SaveChanges();
}
}
このようにして、SqlUnitOfWork を使用してすべてのリポジトリを 1 つのポイントから管理できます。以前のプロジェクトでこのデザインを使用しましたが、かなりうまく機能しましたが、効率的ではなく、冗長であると感じています。このような抽象化層を追加する価値はありますか?
前もって感謝します!