Sto lavorando su un'applicazione web mv asp.net e sull'entità framework 6. Voglio averli nella mia applicazione: -
Classe di repository generica.
Classe di repository dedicata per ogni tipo di entità. Dove questo repository dedicato sarà derivato dal repository generico.
Avere un'unità di classe di lavoro che si coordinerà tra i repository dedicati in modo che tutte le operazioni dai repository vengano incluse in una singola transazione di database.
Il repository generico è: -
namespace SkillManagement.DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SkillManagementEntities context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SkillManagementEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}//code goes here...
L'interfaccia
namespace SkillManagement.DAL
{
public interface ISkillTypeRepository {
}
}
Uno dei repository dedicato: -
namespace SkillManagement.DAL
{
public class SkillTypeRepository : GenericRepository<SkillType> , ISkillTypeRepository ,IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
public SkillTypeRepository(SkillManagementEntities db)
: base(db)
{
}
public void Dispose()
{
db.Dispose();
}
public void Save()
{
db.SaveChanges();
}
}
L'unità di lavoro
namespace SkillManagement.DAL
{
public class UnitOfWork : IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
private SkillTypeRepository skillTypeRepository;
private Repository2 repository2;
private Repository3 repository3;
// code goes here....
public SkillTypeRepository SkillTypeRepository
{
get
{
if (this.skillTypeRepository == null)
{
this.skillTypeRepository = new SkillTypeRepository(db);
}
return skillTypeRepository;
}
}
//code goes here for repository2 , repository3 , etc..
public void Save()
{
db.SaveChanges();
}
Poi all'interno del mio Controller sarò chiamato l'unite della classe di lavoro come segue: -
public class SkillTypeController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
//
// GET: /Course/
public ViewResult Index()
{
var skilltype = unitOfWork.SkillTypeRepository.Get();
return View(courses.ToList());
}
Quindi la mia domanda è fondamentalmente su se sto passando l'oggetto Context correttamente tra il repository dedicato >> repository generico >> unità di lavoro. Quindi tutte le operazioni da più repository saranno racchiuse in una singola transazione db?
Qualcuno può consigli per favore?
Penso che private SkillManagementEntities db = new SkillManagementEntities();
solo private SkillManagementEntities db = new SkillManagementEntities();
in tutti i repository è sufficiente.
Hai già avuto un singolo contesto private SkillManagementEntities db = new SkillManagementEntities();
è la tua unità di lavoro. Basta passarlo a tutti i tuoi repository, non creare un nuovo contesto all'interno di alcun repository.