C# 工作类单元如何知道在提交时调用哪个存储库?

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时,它如何根据新对象列表知道要调用哪个存储库和方法?假设它包含一个用户对象

*前言:我对工作单元模式非常陌生*

我的目标是实现一个工作类单元,它能够跟踪在给定事务中更改的所有对象。我读到的关于工作单元模式的所有内容都与存储库模式并驾齐驱。这就是我想要使用的方法

比如说,我创建了一个新用户。在我的工作单元对象上,我有一个新创建对象的列表,因此我将我的新用户添加到此列表中。我的用户存储库有一个名为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类,在请求提交之前将更改存储在内存中,实现可以是:RegisterAdd(实体)、RegisterDelete(实体)、RegisterUpdate(实体)。。。。然后提交();它将遍历所有已注册的更改并提交。()
  • 您可以将TransactionScope用作分布式事务,以对所有更新进行分组,并在工作单元结束时提交。()
  • 是一种已经由ORM实现的基础架构模式,就像。你不必重新发明轮子。另一方面,它是您的域模型的一部分。存储库和UnitOfWork在运行。UnitOfWork不需要调用存储库,因为它不知道存储库是什么。它处理不同的抽象。它有一个内置的实体缓存,它知道这些实体处于什么状态。然而,UnitOfWork可以注入到存储库中


    正确地实现UnitOfWork、IdentityMap、更改跟踪和延迟加载都是乏味的。您真的应该使用现有的ORM作为基础结构层,帮助您关注重要的领域。

    ServiceLocator.Current.GetInstance()这是Castle Window IoC框架中的吗?@sinclairchase这是Microsoft模式与实践的公共服务定位器。它是任何IoC框架的通用接口,因此开发人员可以使用通用接口创建支持IoC的解决方案。温莎城堡有一个适配器,你可以在这里找到它:
    public interface IRepository<out TDomainObject>
        where TDomainObject : DomainObject