C# 工作类单元如何知道在提交时调用哪个存储库?
*前言:我对工作单元模式非常陌生* 我的目标是实现一个工作类单元,它能够跟踪在给定事务中更改的所有对象。我读到的关于工作单元模式的所有内容都与存储库模式并驾齐驱。这就是我想要使用的方法 比如说,我创建了一个新用户。在我的工作单元对象上,我有一个新创建对象的列表,因此我将我的新用户添加到此列表中。我的用户存储库有一个名为Create的方法,该方法接收用户并调用存储过程将数据添加到数据库中。当我在我的工作单元上调用commit时,它如何根据新对象列表知道要调用哪个存储库和方法?假设它包含一个用户对象和一个注释对象。两者都是新创建的,需要在提交时添加。我不知道怎样才能做到这一点 有人能更好地解释一下吗?如果可能的话,甚至可以举个小例子C# 工作类单元如何知道在提交时调用哪个存储库?,c#,asp.net,design-patterns,domain-driven-design,unit-of-work,C#,Asp.net,Design Patterns,Domain Driven Design,Unit Of Work,*前言:我对工作单元模式非常陌生* 我的目标是实现一个工作类单元,它能够跟踪在给定事务中更改的所有对象。我读到的关于工作单元模式的所有内容都与存储库模式并驾齐驱。这就是我想要使用的方法 比如说,我创建了一个新用户。在我的工作单元对象上,我有一个新创建对象的列表,因此我将我的新用户添加到此列表中。我的用户存储库有一个名为Create的方法,该方法接收用户并调用存储过程将数据添加到数据库中。当我在我的工作单元上调用commit时,它如何根据新对象列表知道要调用哪个存储库和方法?假设它包含一个用户对象
谢谢。这通常是通过更改跟踪来实现的,无论在工作单元/会话/上下文知道的实体上发生什么操作,并在提交时执行适当的操作 更改状态可能包括新建、修改和删除 查看此以了解更多信息 使用它的实现来获得更好的想法可能会有所帮助
实体框架实现了工作单元模式。也许使用它会让你更好地理解它。解决这个问题最常用的方法之一是使用控制反转 例如,您有自己的类User和Comment,并且实现了一个通用存储库
IRepository
。获取用户或注释的存储库只是给出TDomainObject参数:
i假设
i假设
IRepository
和IRepository
,因此如果您使用类似Microsoft Pattern&Practices的公共服务定位器,并且我们在您的工作单元中处于提交方法主体中:
foreach(新对象中的某些域对象)
{
((IRepository)ServiceLocator.Current.GetInstance(Type.GetType(string.Format(“NamespacesToGenericRepository.IRepository`1[[{0}]]”,some.GetType().FullName)))。添加(some);
}
注意IRepository
有一个逆变的TDomainObject泛型参数,该参数类型必须继承名为DomainObject的域对象的基本类型,它允许将类似IRepository
的内容向上转换为IRepository
换句话说,您的IRepository
接口签名将如下所示:
public interface IRepository<out TDomainObject>
where TDomainObject : DomainObject
公共接口IRepository
其中TDomainObject:DomainObject
这只是关于如何实现定位具体存储库的摘要和/或提示,以便域对象的工作单元可以管理任何特定域对象的工作单元
如果您想了解更多关于控制反转的信息,请查看这篇维基百科文章:
正确地实现UnitOfWork、IdentityMap、更改跟踪和延迟加载都是乏味的。您真的应该使用现有的ORM作为基础结构层,帮助您关注重要的领域。ServiceLocator.Current.GetInstance()这是Castle Window IoC框架中的吗?@sinclairchase这是Microsoft模式与实践的公共服务定位器。它是任何IoC框架的通用接口,因此开发人员可以使用通用接口创建支持IoC的解决方案。温莎城堡有一个适配器,你可以在这里找到它:
public interface IRepository<out TDomainObject>
where TDomainObject : DomainObject