C# C-存储库/UnitOfWork-阻止直接访问存储库

C# C-存储库/UnitOfWork-阻止直接访问存储库,c#,C#,我正在创建一个通用的工作单元,存储库模式 **我知道这还远未完成,但显示此代码占用的空间较少:-** 我有以下一般性假设 那么我有这个的实现: public abstract class UnitOfWork : IUnitOfWork { #region Constructors protected UnitOfWork(DbContext context) { Context = context; } #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; } 
}
new Repository<Person>(new DbContext("")).Insert(new Person());
这是我想避免的事情。我希望用户只通过工作单元对象处理存储库

我已经考虑将构造函数更改为internal,但当您访问数据库的方法与存储库本身在同一个项目中时,这并不能解决问题


有没有办法限制对存储库的各种访问并强制用户通过工作单元?

其他类是否需要person存储库?如果不是的话,你可以在TestUnitOfWork中把它变成一个私有类,它可能会做你想做的事情。我没有太多使用子类,所以不确定可访问性是否能完美工作。我不认为,强迫用户这样做是个好主意。用户可以有常规理由直接使用存储库。如果您想在项目中强制这种做法,您应该有约定和可选的静态代码分析。@TcKs您的意思是没有办法直接限制对存储库的访问吗?至少,用户可以始终使用反射来使用/实例化类。因此,事实上,如果没有在嵌套类中隐藏极端复杂的类型并使用CA,您永远不会100%禁止同一程序集的代码访问存储库。@复杂性:一般来说,如果类A TestUnitOfWork可以创建类B存储库的实例,那么与类A在同一程序集中的类C也可以创建类B的实例。我唯一能想到的可能不是这样的情况是,对于像我这样的私有子类评论。当然,没有什么东西可以装饰B类,让A类创建它,但B类不能。
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; } 
}
new TestUnitOfWork(new DbContext("")).PersonRepository.Insert(new Person());
new Repository<Person>(new DbContext("")).Insert(new Person());