*前言:我对工作单元模式不熟悉*
我的目标是实现一个工作单元,它能够跟踪整个给定事务中已更改的所有对象。我读到的关于工作单元模式的所有内容都与存储库模式并列。所以这就是我想要使用的方法。
比如说我创建了一个新用户。在我的工作单元对象上,我有一个新创建的对象列表,因此我将新用户添加到此列表中。我的用户存储库有一个名为Create的方法,它接收用户并调用存储过程以将数据添加到数据库。当我在我的工作单元上调用commit时,它将如何知道基于新对象列表调用哪个存储库和方法?假设它包含User对象和Comment对象。两者都是新创建的,需要在提交时添加。我不确定如何做到这一点。
有人可以更好地解释这一点,如果可能的话甚至可能是一个小例子吗?
感谢。
答案 0 :(得分:4)
UnitOfWork是一种基础结构模式,已由ORM实施,就像Identity Map一样。你不必重新发明轮子。另一方面,Repository是您的域模型的part。存储库和UnitOfWork在different levels运行。 UnitOfWork不需要调用Repository,因为它不知道Repository是什么。它处理不同的抽象。它有一个内置的实体缓存,它知道这些实体所处的状态。然而,UnitOfWork可以注入到Repository中。
正确实现UnitOfWork,IdentityMap,更改跟踪,延迟加载非常繁琐。您应该将现有的ORM用作基础架构层,以帮助您将重点放在重要的事项上 - 域。
答案 1 :(得分:0)
这通常通过更改跟踪来实现,无论在工作单元/会话/上下文知道的实体上发生什么操作,并在提交时执行相应的操作。
更改状态可以包括“新建”,“已修改”和“已删除”。
查看此link了解详情。
使用它的实现来获得更好的想法可能会有所帮助。
实体框架实现工作单元模式。也许使用它会让你更好地理解它。
答案 2 :(得分:0)
解决此问题的最常见方法之一是使用控制反转。
例如,您的类是User和Comment,并且您已经实现了通用存储库IRepository<TDomainObject>
。获得User或Comment的存储库只是提供TDomainObject参数:
IRepository<User>
IRepository<Comment>
稍后您已配置了谁正在实施IRepository<User>
和IRepository<Comment>
,因此如果您使用的是Microsoft Pattern&amp;实践的公共服务定位器,我们在工作单元中的提交方法体中:
foreach(DomainObject some in NewObjects)
{
((IRepository<DomainObject>)ServiceLocator.Current.GetInstance(Type.GetType(string.Format("NamespacesToGenericRepository.IRepository`1[[{0}]]", some.GetType().FullName)))).Add(some);
}
注意IRepository<TDomainObject>
有一个逆变 TDomainObject 泛型参数,该类型必须继承一个名为 DomainObject 的基本类型的域对象,允许将IRepository<User>
转换为IRepository<DomainObject>
。
换句话说,您的IRepository<TDomainObject>
界面签名将如下所示:
public interface IRepository<out TDomainObject>
where TDomainObject : DomainObject
这只是关于如何实现定位具体存储库的摘要和/或提示,以便域对象的工作单元可以管理任何专用域对象。
如果您想了解有关控制反转的更多信息,请查看此维基百科文章:
而且,由于我自己的经验,我想建议您使用温莎城堡作为反转控制选择框架:
答案 3 :(得分:0)
您有多种方法: