gpt4 book ai didi

c# - 工作单元和存储库模式之间的交互

转载 作者:IT王子 更新时间:2023-10-29 04:44:48 26 4
gpt4 key购买 nike

在阅读大量文章后,我仍然不确定与存储库交互时工作单元模式的职责。

存储库负责加载和保存聚合根实体,因此请考虑以下示例代码:

using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";

roots.Save(root);
uow.Commit();
}

工作接口(interface)单元将使用以下方法定义:

public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}

假设存储库是使用非常简单的 SQL Mapper 实现的,因此 FindByName 包含一些直接 SQL 以返回 ARoot,Save 实现看起来像这样吗:

public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
}

然后,工作单元提交代码将构建所有必需的 SQL 以将实体映射回数据库?

问题2)

如果我将聚合根添加到工作单元中,工作单元是否负责保留根及其子实体,或者应该是存储库的 Save 方法将更改的实体添加到工作单元中?例如

public void Save(T entity)
{
IUnitOfWork uow = GetUnitOfWork();
// Tell the UOW we are updating this entity
uow.Update(entity);
uow.Update(entity.AChildObject);
}

或者...交替

工作单元是否仅处理聚合根,并在提交时为其更改集中的每个对象调用存储库 Save 方法,保留 SQL 映射代码以将实体持久保存在存储库中,将第一个代码示例更改为

using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";

//roots.Save(root);
uow.Update(root);
// and commit
uow.Commit();
}

谢谢,

詹姆斯

最佳答案

在我们的项目中,我们使用存储库来表现得像实体的集合,而 UnitOfWork 用于跟踪这些实体的更改,并将它们写回数据存储。

如果您正在使用 LinqToSql 或其他一些 OR Mapper,那么它本身很可能会实现一个 UnitOfWork 模式,因此我们通常只是在我们自己的 IUnitOfWork 中使用 ORMapper 实例。

我们的存储库界面通常类似于..

  IEnumerable<Order> FindByCustomerId(string customerId);
void Add(Order order);
void Remove(Order order);

我们在存储库中没有任何保存方法。如果我们不需要 UnitOfWork,则 Add/Remove 方法直接作用于数据存储。

如果我们需要一个 UnitOfWork,那么公共(public)接口(interface)类似于...

void Commit();
void Rollback();

存储库有一个与 UnitOfWork 的内部接口(interface),因此当我们查询存储库时,返回的对象将由 UnitOfWork 跟踪更改。 commit 方法将更改写回数据存储区,rollback 方法只是清除它的更改。

当我们使用 LinqToSql 时,DataContext 负责更改跟踪,在回滚时,我们只需实例化一个新的上下文。跨根及其子节点处理持久性。一个 UnitOfWork 实例在所有存储库之间共享。

当我们不使用 LinqToSql 时,我们会实现我们自己的 UnitOfWork,也许它会调用网络服务或其他东西,在这种情况下,我们会使用 EntityBase 类在实体类本身中进行更改跟踪。

我们为每个根都有一个存储库,但有时一个根的子级本身也被用作根,因此我们经常需要像 OrderLineRepository 这样的东西,因为我们的系统中有一个用例,用户想要搜索 Order行。

关于c# - 工作单元和存储库模式之间的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2113502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com