C# - Repository / UnitOfWork - 直接阻止对Repository的访问

时间:2014-08-12 09:16:44

标签: c#

我正在创建一个通用的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但当您访问数据库的方法与存储库本身位于同一项目中时,这并不能解决问题。

有没有办法限制对存储库的所有类型的访问并强迫用户完成工作单元?

0 个答案:

没有答案