HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Web API using Repository / UnitOfWork

Submitted by: @import:stackexchange-codereview··
0
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.

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.

  • I would rename IGenericRepository to IRepository, I don't think Generic adds readability.



  • I don't like exposing IQueryable in 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.