Jestem zmuszony w obecnym projekcie skorzystać z Repository Pattern
, o ile w moim przekonaniu DbContext
i DbSet
załatwia sprawę repozytoriów i UoW, w obecnych wymaganiach projektu muszę oddzielić tą warstwę (istnieje możliwość podmiany DAL, jak i korzystania z 2/3 różnych jej implementacji). Dodam, że jest to aplikacja kliencka, wielowątkowa. Aplikacja jest podzielona na moduły, każdy moduł będzie działać na osobnym repozytorium, w większości przypadków wystarczyć będą jedynie operacje CRUD, dlatego zdecydowałem się na bazowe generyczne repozytorium.
internal abstract class RepositoryBase<T> : IRepository<T> where T : EntityBase
{
protected readonly SecureDbContext DbContext;
public RepositoryBase(SecureDbContext dbContext)
{
if (dbContext == null) throw new ArgumentNullException("dbContext");
this.DbContext = dbContext;
}
public void Add(T entity)
{
this.DbContext.Set<T>().Add(entity);
this.DbContext.SaveChanges();
}
public void Delete(T entity)
{
this.DbContext.Set<T>().Remove(entity);
this.DbContext.SaveChanges();
}
public T Get(int id)
{
return this.DbContext.Set<T>().Find(id);
}
public IEnumerable<T> GetAll()
{
return this.DbContext.Set<T>().AsEnumerable();
}
public void Update(T entity)
{
this.DbContext.Entry(entity).State = EntityState.Modified;
this.DbContext.SaveChanges();
}
}
Każdy moduł aplikacji będzie miał wstrzykiwane repozytorium w konstruktorze. Zastanawia mnie czy dobrze robię, że trzymam cały czas połączenie z bazą danych (w dodatku jeśli jest to aplikacja wielowątkowa), czy nie będzie pobierało to za dużo zasobów? Zastanawiam się czy nie lepszym rozwiązaniem byłoby stworzyć interfejs:
interface IDbContextFactory : IDisposable
{
public DbContext GetDbContext()
{
return new DbContext("connection_string");
}
}
a następnie zmienić implementację generycznego repo tak:
internal abstract class RepositoryBase<T> : IRepository<T> where T : EntityBase
{
protected readonly IDbContextFactory factory;
public RepositoryBase(IDbContextFactory factory)
{
this.factory= factory;
}
public void Add(T entity)
{
using (DbContext db = factory.GetDbContext())
{
db.Set<T>().Add(entity);
db.SaveChanges();
}
}
}
Co myślicie? A może rozwiązuje się to jakoś inaczej?