我一直在玩实体框架和存储库模式,但我想知道我目前正在做的事情是否有任何错误,或者我该如何改进它。
我的场景经常需要我从我们的 HR 系统 Oracle 数据库中读取只读,然后对于我正在处理的应用程序,我倾向于将该应用程序的数据存储在它自己的 MS Sql 数据库中,偶尔也会存储在我自己创建的一些表中人力资源 Oracle 数据库。
我的目标是获得一种可重用、强大的数据访问方法,并确保数据能够以有效和可靠的方式使用。我还需要找出为某些实体创建一些更具体的数据访问方法的最佳方法,例如我的通用存储库没有创建、编辑或删除方法,因为我想消除在 HR 数据库中编辑数据的风险,但是因为我说我可能有自己的表,我确实想在 HR 数据库中编辑、创建和删除数据。同样,我可能想使用我的通用存储库和工作单元来访问我目前不知道如何处理的多个数据源。
此外,我目前不使用任何接口,并且想知道我是否可以或应该实现这些接口,例如 IRepository、IUnitOfWork、IContext 等?
目前,我使用针对 DbContext 的通用存储库模式来提供一些处理数据的基本方法。然后我有一个 unitofwork 实现,以便我可以轻松访问我的实体模型的各种存储库。
例如
UnitOfWork uow = new UnitOfWork();
var data = uow.StaffRepository.Get();
以下是我到目前为止的实现:
通用存储库
public class GenericRepository<T> where T : class
{
internal CHRISCSEntities c21context;
internal DbSet<T> dbSet;
public GenericRepository(CHRISCSEntities c21context)
{
this.c21context = c21context;
this.dbSet = c21context.Set<T>();
}
public virtual IEnumerable<T> Get(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "")
{
IQueryable<T> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual T GetByID(object id)
{
return dbSet.Find(id);
}
}
这是我的工作单元:
public class UnitOfWork : IDisposable
{
private CHRISCSEntities c21context = new CHRISCSEntities();
private GenericRepository<EMPOS> emposRepository;
private GenericRepository<PSLDW> psldwRepository;
private GenericRepository<UPZ88> upz88Repository;
private GenericRepository<EMLVE> emlveRepository;
private GenericRepository<EMDET> emdetRepository;
private GenericRepository<PSDET> psdetRepository;
private GenericRepository<DASH_PYLVR> pylvrRepository;
public GenericRepository<DASH_PYLVR> PylvrRepository
{
get
{
if (this.pylvrRepository == null)
{
this.pylvrRepository = new GenericRepository<DASH_PYLVR>(c21context);
}
return pylvrRepository;
}
}
public GenericRepository<PSDET> PsdetRepository
{
get
{
if (this.psdetRepository == null)
{
this.psdetRepository = new GenericRepository<PSDET>(c21context);
}
return psdetRepository;
}
}
public GenericRepository<EMDET> EmdetRepository
{
get
{
if (this.emdetRepository == null)
{
this.emdetRepository = new GenericRepository<EMDET>(c21context);
}
return emdetRepository;
}
}
public GenericRepository<EMLVE> EmlveRepository
{
get
{
if (this.emlveRepository == null)
{
this.emlveRepository = new GenericRepository<EMLVE>(c21context);
}
return emlveRepository;
}
}
public GenericRepository<EMPOS> EmposRepository
{
get
{
if (this.emposRepository == null)
{
this.emposRepository = new GenericRepository<EMPOS>(c21context);
}
return emposRepository;
}
}
public GenericRepository<PSLDW> PsldwRepository
{
get
{
if (this.psldwRepository == null)
{
this.psldwRepository = new GenericRepository<PSLDW>(c21context);
}
return psldwRepository;
}
}
public GenericRepository<UPZ88> Upz88Repository
{
get
{
if (this.upz88Repository == null)
{
this.upz88Repository = new GenericRepository<UPZ88>(c21context);
}
return upz88Repository;
}
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
c21context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
任何帮助将非常感激,
安迪