我正在创建一个通用的UnitOfWork,Repository模式。
**我知道它已经完成了,但显示此代码占用的空间较少:-) **
我有以下通用 IRepository
public interface IRepository<TEntity> where TEntity : class
{
#region Methods
TEntity GetById(int id);
void Insert(TEntity entity);
void Delete(TEntity entity);
#endregion
}
当然,我确实有一个实现:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
#region Constructors
public Repository(DbContext context)
{
DbSet = context.Set<TEntity>();
}
#endregion
#region Properties
protected DbSet<TEntity> DbSet;
#endregion
#region IRepository Members
public TEntity GetById(int id)
{
return DbSet.Find(id);
}
public void Insert(TEntity entity)
{
DbSet.Add(entity);
}
public void Delete(TEntity entity)
{
DbSet.Remove(entity);
}
#endregion
}
作为下一点,我确实有 IUnitOfWork : IUnitOfWork接口只有一个成员Commit()。
public interface IUnitOfWork : IDisposable
{
#region Methods
void Commit();
#endregion
}
然后我确实有这个实现:
public abstract class UnitOfWork : IUnitOfWork
{
#region Constructors
protected UnitOfWork(DbContext context)
{
Context = context;
}
#endregion
#region Properties
protected DbContext Context { get; set; }
#endregion
#region IUnitOfWork Members
public void Dispose()
{
Context.Dispose();
}
public void Commit()
{
Context.SaveChanges();
}
#endregion
}
现在,想法如下:
我有一个代表数据库中单个实体的类:
public class Person
{
public string Name { get; set; }
}
然后我确实拥有使用此实体的存储库:
public class Repository<Person> : Repository<Person> where Person : class
{
public Repository(DbContext context) : base(context)
{
}
}
然后我有我的工作单元,它创建了存储库:
public class TestUnitOfWork : UnitOfWork
{
public TestUnitOfWork(DbContext context) : base(context)
{
PersonRepository = new Repository<Person>(context);
}
public Repository<Person> PersonRepository { get; set; }
}
但是这个代码确实存在问题,它可以完美运行,我可以这样做:
我可以通过UnitOfWork使用存储库:
new TestUnitOfWork(new DbContext("")).PersonRepository.Insert(new Person());
但是,我也可以直接在存储库上工作:
new Repository<Person>(new DbContext("")).Insert(new Person());
这是我想避免的。我希望用户只通过工作单元对象处理存储库。
我已经尝试将构造函数更改为internal但当您访问数据库的方法与存储库本身位于同一项目中时,这并不能解决问题。
有没有办法限制对存储库的所有类型的访问并强迫用户完成工作单元?