-------------------------------------------------------------------------------------
public interface IUnitOfWork : IDisposable { ICourseRepository Courses { get; } IAuthorRepository Authors { get; } int Complete();
}
-------------------------------------------------------------------------------------
public class UnitOfWork : IUnitOfWork { private readonly PlutoContext _context; public UnitOfWork(PlutoContext context) { _context = context; Courses = new CourseRepository(_context); Authors = new AuthorRepository(_context); } public ICourseRepository Courses { get; private set; } public IAuthorRepository Authors { get; private set; } public int Complete() { return _context.SaveChanges(); } public void Dispose() { _context.Dispose(); }
}
public interface IRepository<TEntity> where TEntity : class { TEntity Get(int id); IEnumerable<TEntity> GetAll(); IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate); // This method was not in the videos, but I thought it would be useful to add. TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate); void Add(TEntity entity); void AddRange(IEnumerable<TEntity> entities); void Remove(TEntity entity); void RemoveRange(IEnumerable<TEntity> entities);
}
-------------------------------------------------------------------------------------
public interface ICourseRepository : IRepository<Course> { IEnumerable<Course> GetTopSellingCourses(int count); IEnumerable<Course> GetCoursesWithAuthors(int pageIndex, int pageSize);
}
-------------------------------------------------------------------------------------
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class { protected readonly DbContext Context; public Repository(DbContext context) { Context = context; } public TEntity Get(int id) { // Here we are working with a DbContext, not PlutoContext. So we don't have DbSets // such as Courses or Authors, and we need to use the generic Set() method to access them. return Context.Set<TEntity>().Find(id); } public IEnumerable<TEntity> GetAll() { // Note that here I've repeated Context.Set<TEntity>() in every method and this is causing // too much noise. I could get a reference to the DbSet returned from this method in the // constructor and store it in a private field like _entities. This way, the implementation // of our methods would be cleaner: // // _entities.ToList(); // _entities.Where(); // _entities.SingleOrDefault(); // // I didn't change it because I wanted the code to look like the videos. But feel free to change // this on your own. return Context.Set<TEntity>().ToList(); } public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) { return Context.Set<TEntity>().Where(predicate); } public TEntity SingleOrDefault(Expression<Func<TEntity, bool>> predicate) { return Context.Set<TEntity>().SingleOrDefault(predicate); } public void Add(TEntity entity) { Context.Set<TEntity>().Add(entity); } public void AddRange(IEnumerable<TEntity> entities) { Context.Set<TEntity>().AddRange(entities); } public void Remove(TEntity entity) { Context.Set<TEntity>().Remove(entity); } public void RemoveRange(IEnumerable<TEntity> entities) { Context.Set<TEntity>().RemoveRange(entities); }
}
-------------------------------------------------------------------------------------
public class PlutoContext : DbContext { public PlutoContext() : base("name=PlutoContext") { this.Configuration.LazyLoadingEnabled = false; } public virtual DbSet<Author> Authors { get; set; } public virtual DbSet<Course> Courses { get; set; } public virtual DbSet<Tag> Tags { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new CourseConfiguration()); }
}
-------------------------------------------------------------------------------------
public class UnitOfWork : IUnitOfWork { private readonly PlutoContext _context; public UnitOfWork(PlutoContext context) { _context = context; Courses = new CourseRepository(_context); Authors = new AuthorRepository(_context); } public ICourseRepository Courses { get; private set; } public IAuthorRepository Authors { get; private set; } public int Complete() { return _context.SaveChanges(); } public void Dispose() { _context.Dispose(); } }