我在存储库模式方面有一些问题。或者只是一些不明确的观点。为了解决这些问题,我有一个包含两个实体聚合的简单示例域。
public class Category
{
string Name {get;set;}
Category Parent {get;set;}
IList<Category> Children {get;set;}
}
public class Transaction
{
Category Owner {get;set;}
string Name
... bla bla
}
在这个特定的领域模型中,这两者并不形成一个单一的聚合。因此,对于这两个实体,我有两个标准的IRepository实现。
问题1:在处理验证(如删除类别)时,存储库需要进行关系检查。是否有一种常见的做法:存储库与其他存储库的对话(以及由此注入的引用)并生成错误,从而使其与其他层保持整齐地断开连接,还是将其委托给数据库层?
问题2:类似地,在更新实体(聚合)时,通常需要对各种组件进行保存/更改/删除验证。想必,这是合理的,只有当你有一个工作单位,缓冲变化,只有提交时,所有的验证成功?
问题三:加载单个类别会导致在不使用延迟加载时加载整个对象树。要限制这一点,唯一的实际选择是在实体中实现延迟加载和/或更改跟踪?
发布于 2011-04-12 01:12:02
对于所有三个问题,我建议您实现UnitOfWork模式。我通常实现IUnitOfWork
,这是我的存储库的一部分。当我想使用更多的存储库时,我将(同样的) UnitOfWork注入到我想使用的所有存储库中(这只是我喜欢的方式之一)。然后,当所有工作完成后,我在我的UnitOfWork上调用Commit(),这会对实体框架上下文进行保存。UnitOfWork是实体框架上下文的包装器。
问题一:关系检查是由数据库完成的。如果实体框架出现故障,并且您应该在高级应用程序层中处理异常,那么让我们将其称为服务层,在其中使用UnitOfWork。
问题二:使用UnitOfWork模式。
问题三:如果不想加载整个对象树,则应该使用延迟加载。
储存库:
public interface IRepository<T>
{
IUnitOfWork UnitOfWork { get; set; }
IQueryable<T> All();
void Delete(T item);
void Save(T item);
void Update(T item);
IQueryable<T> Find(Func<T, bool> expression);
void Attach(T item);
}
UnitOfWork:
public interface IUnitOfWork : IDisposable
{
ObjectContext Context { get; set; }
void Commit();
bool LazyLoadingEnabled { get; set; }
bool ProxyCreationEnabled { get; set; }
string ConnectionString { get; set; }
}
或者,这里是UnitOfWork模式的非常简单的实现,让您开始工作(这与我描述的UnitOfWork包含存储库略有不同,而我的方法正好相反.)。
https://stackoverflow.com/questions/5632633
复制