patterncsharpMinor
Web API using Repository / UnitOfWork
Viewed 0 times
repositoryusingwebunitofworkapi
Problem
I'm looking for feedback on a repository I set up based on a blog post I read here.
I have just recently got more into .NET within the past year, so any feedback and/or best practices that can be thrown my way would be appreciated.
The branch I am working in can be seen here if interested.
```
public class EfGenericRepository : IGenericRepository where T : class
{
public readonly IDbSet _dbSet;
public EfGenericRepository(IDbSet dbSet)
{
_dbSet = dbSet;
}
public virtual IQueryable AsQueryable()
{
return _dbSet.AsQueryable();
}
public IEnumerable GetAll()
{
return _dbSet;
}
public IEnumerable Find(Expression> predicate)
{
return _dbSet.Where(predicate);
}
public T Single(Expression> predicate)
{
return _dbSet.Single(predicate);
}
public T SingleOrDefault(Expression> predicate)
{
return _dbSet.SingleOrDefault(predicate);
}
public T First(Expression> predicate)
{
return _dbSet.First(predicate);
}
public T FirstOrDefault(Expression> predicate)
{
return _dbSet.FirstOrDefault(pre
I have just recently got more into .NET within the past year, so any feedback and/or best practices that can be thrown my way would be appreciated.
The branch I am working in can be seen here if interested.
IGenericRepository:public interface IGenericRepository where T : class
{
IQueryable AsQueryable();
IEnumerable GetAll();
IEnumerable Find(Expression> predicate);
T Single(Expression> predicate);
T SingleOrDefault(Expression> predicate);
T First(Expression> predicate);
T FirstOrDefault(Expression> predicate);
T GetById(int id);
void Add(T entity);
void Delete(T entity);
void Attach(T entity);
}IScrapedRepository:public interface IScrapedRepository : IGenericRepository where T : class
{
bool IsRefreshRequired();
void RefreshData();
}IUnitOfWork:public interface IUnitOfWork : IDisposable
{
IGenericRepository OpeningOptionRepository { get; }
IGenericRepository LocationRepository { get; }
void Commit();
}EFGenericRepository:```
public class EfGenericRepository : IGenericRepository where T : class
{
public readonly IDbSet _dbSet;
public EfGenericRepository(IDbSet dbSet)
{
_dbSet = dbSet;
}
public virtual IQueryable AsQueryable()
{
return _dbSet.AsQueryable();
}
public IEnumerable GetAll()
{
return _dbSet;
}
public IEnumerable Find(Expression> predicate)
{
return _dbSet.Where(predicate);
}
public T Single(Expression> predicate)
{
return _dbSet.Single(predicate);
}
public T SingleOrDefault(Expression> predicate)
{
return _dbSet.SingleOrDefault(predicate);
}
public T First(Expression> predicate)
{
return _dbSet.First(predicate);
}
public T FirstOrDefault(Expression> predicate)
{
return _dbSet.FirstOrDefault(pre
Solution
Overall this looks quite good.
You don't know when database server will execute the sql.
- I would rename
IGenericRepositorytoIRepository, I don't think Generic adds readability.
- I don't like exposing
IQueryablein a public interface, it is a leaky abstraction.
You don't know when database server will execute the sql.
- I would not have my UnitOfWork own repositories because it is difficult to test/mock.
Context
StackExchange Code Review Q#87295, answer score: 2
Revisions (0)
No revisions yet.