Jam*_*son 19 c# domain-driven-design repository unit-of-work repository-pattern
在阅读了大量文章之后,我仍然不确定在与存储库交互时工作单元模式的职责.
存储库负责加载和保存聚合根实体,因此请考虑以下示例代码:
using(IUnitOfWork uow = container.CreateUnitOfWork())
{
Repository<ARoot> roots = container.GetRepository<ARoot>();
ARoot root = root.FindByName("ARoot");
root.Name = "ANewName";
roots.Save(root);
uow.Commit();
}
Run Code Online (Sandbox Code Playgroud)
工作单元接口将使用以下方法定义:
public interface IUnitOfWork
{
void Insert(object);
void Update(object);
void Delete(object);
void Commit();
void Rollback();
}
Run Code Online (Sandbox Code Playgroud)
可以说存储库是使用非常简单的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);
}
Run Code Online (Sandbox Code Playgroud)
然后,工作单元提交代码将构造所有必需的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);
}
Run Code Online (Sandbox Code Playgroud)
或者... ......另外
一个工作单元是否仅处理聚合根,并且在提交时调用存储库为其更改集中的每个对象保存方法,保持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();
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
詹姆士
在我们的项目中,我们使用存储库来表现得就像实体的集合,而工作单元用于跟踪这些实体的更改,并将它们写回数据存储。
如果您使用 LinqToSql 或其他一些 OR Mapper,那么它本身可能会实现 UnitOfWork 模式,因此通常我们只是在自己的 IUnitOfWork 中实现 ORMapper 实例。
我们的存储库界面通常类似于..
IEnumerable<Order> FindByCustomerId(string customerId);
void Add(Order order);
void Remove(Order order);
Run Code Online (Sandbox Code Playgroud)
我们在存储库中没有任何保存方法。如果我们不需要工作单元,则添加/删除方法将直接作用于数据存储。
如果我们需要一个 UnitOfWork,那么公共接口就像......
void Commit();
void Rollback();
Run Code Online (Sandbox Code Playgroud)
存储库与 UnitOfWork 有一个内部接口,因此当我们查询存储库时,UnitOfWork 会跟踪返回的对象是否发生更改。提交方法将更改写回数据存储,回滚方法只是清除其更改。
当我们使用 LinqToSql 时,DataContext 负责更改跟踪,在回滚时我们只需实例化一个新的 Context。持久性是通过根及其子节点来处理的。所有存储库之间共享一个 UnitOfWork 实例。
当我们不使用 LinqToSql 时,我们会实现自己的 UnitOfWork,也许它调用 Web 服务或其他东西,在这种情况下,我们使用 EntityBase 类在实体类本身中进行更改跟踪。
我们为每个根都有一个存储库,但有时一个根的子级本身也用作根,因此我们经常需要像 OrderLineRepository 这样的东西,因为我们的系统中有一个用例,用户想要搜索订单行。
| 归档时间: |
|
| 查看次数: |
3601 次 |
| 最近记录: |