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());