Estoy usando EF/Repositorio/Unidad de trabajo, pero estoy teniendo dificultades para entender algunos detalles. Dentro de UnitOfWork, creo un EF DbContext nuevo (EmmaContext), pero miro dentro del repositorio, lo echo, que sé que está mal, ¿cómo obtengo el contexto dentro del repositorio correctamente? Tal vez estoy totalmente en el camino equivocado?Marco de la entidad y Unidad de trabajo
Aquí es mi UnitOfWork:
//Interface
public interface IUnitOfWork : IDisposable
{
void Commit();
}
//Implementation
public class UnitOfWork : IUnitOfWork
{
#region Fields/Properties
private bool isDisposed = false;
public EmmaContext Context { get; set; }
#endregion
#region Constructor(s)
public UnitOfWork()
{
this.Context = new EmmaContext();
}
#endregion
#region Methods
public void Commit()
{
this.Context.SaveChanges();
}
public void Dispose()
{
if (!isDisposed)
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
isDisposed = true;
if (disposing)
{
if (this.Context != null)
this.Context.Dispose();
}
}
#endregion
}
Aquí es el repositorio:
//Interface
public interface IRepository<TEntity> where TEntity : class
{
IQueryable<TEntity> Query();
void Add(TEntity entity);
void Attach(TEntity entity);
void Delete(TEntity entity);
void Save(TEntity entity);
}
//Implementation
public abstract class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
#region Fields/Properties
protected EmmaContext context;
protected DbSet<TEntity> dbSet;
#endregion
#region Constructor(s)
public RepositoryBase(IUnitOfWork unitOfWork)
{
this.context = ((UnitOfWork)unitOfWork).Context;
this.dbSet = context.Set<TEntity>();
}
#endregion
#region Methods
public void Add(TEntity entity)
{
dbSet.Add(entity);
}
public void Attach(TEntity entity)
{
dbSet.Attach(entity);
}
public void Delete(TEntity entity)
{
dbSet.Remove(entity);
}
public IQueryable<TEntity> Query()
{
return dbSet.AsQueryable();
}
public void Save(TEntity entity)
{
Attach(entity);
context.MarkModified(entity);
}
#endregion
}
Esto es básicamente lo que he hecho, agregué una interfaz IUnitOfWork, pero en cuanto a la prueba de unidad, ¿qué opinas? ¿De verdad vas a probar tus repositorios y unidad de trabajo? – Sam
Después de pensar un poco, me preguntaba cómo abstraer la implementación al código de llamada y aún obtener el contexto en el repositorio desde un contenedor IoC. ¿Tienes una muestra de código? ¡Gracias! Por cierto, acabo de leer tu libro MVC 3.0, ¡excelente libro! – Sam
@Sam - gracias :) – OdeToCode