- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
1) 在大多数情况下,每个Aggregate Root
都应该定义自己的事务边界,在这种情况下我们不需要公开IUnitOfWork
领域层
中的接口(interface)。
a) 我假设在这种情况下,一个不错的选择是repository
(aggregate
使用它来强制在其中应用invariants
)包含它自己的 UoW
实例(如果使用 EF,那么这个 UoW
实例可以只是 DbContext
类型)?
2)
a) 但是如果出于某种原因 transaction
跨越多个 aggregates
(因此一次需要更改多个 aggregate
),那么Domain Layer
是不是也需要包含IUnitOfWork
接口(interface)呢?
b) 在 Domain Layer
中暴露 IUnitOfWork
接口(interface)不会违反 persistence ignorance rule 吗?
c) 如果 b) 是,那么公开 IUnitOfWork
是否会破坏拥有 repositories
的目的?
回复 Alexey Raga:
1)我建议不要将存储库暴露给聚合。存储库可以为您提供聚合,仅此而已。
a) 虽然我假设大多数 DDD 架构师对将 repo 公开给聚合没有问题(我问这个问题只是因为我阅读了几篇关于 repo 和 DDD 的文章,我的印象是作者不是反对将 repo 公开给聚合 - 但现在我不再那么确定了)?
b) 所以你也反对将存储库暴露给域服务?
c) 从您的回答来看,我猜您考虑将 IUnitOfWork
暴露为违反 PI 的行为?
2)请注意,尽管我的命令处理程序(在某种程度上是应用程序服务)...
您通常将命令处理程序实现为应用服务吗?
3)
public void Handle(ApproveOrderCommand command)
{
var order = Repository.Get(command.OrderId);
property.Approve(command.Comment, ServiceRequiredForOrderApproval);
Repository.Save(order);
}
property.Approve(...)
是打字错误吗?您实际上是指 order.Approve(...)
?
提前致谢
最佳答案
我建议不要将存储库暴露给聚合。存储库可以为您提供聚合,仅此而已。
这样看:您的域是一个“泡泡”,它只了解自己的内容。意思是,它只了解自己的值对象、它声明的领域服务接口(interface)等。我不会在此集合中包含存储库。
当您的域(聚合)需要某些东西时,它应该显式地公开它所需要的东西的依赖性,而不仅仅是请求一些存储库。
服务是将事物结合在一起的原因。例如,我的命令处理程序可能如下所示:
public class ApproveOrderCommandHandler : IHandle<ApproveOrderCommand>
{
//this might be set by a DI container, or passed to a constructor
public IOrderRepository Repository { get; set; }
public ISomeFancyDomainService ServiceRequiredForOrderApproval { get; set; }
public void Handle(ApproveOrderCommand command)
{
var order = Repository.Get(command.OrderId);
order.Approve(command.Comment, ServiceRequiredForOrderApproval);
Repository.Save(order);
}
}
请注意,虽然我的命令处理程序(在某种程度上是应用程序服务)处理存储库,但我的域(订单聚合)是持久性无知的。它对 UnitOfWorks 的存储库一无所知。
当我确实需要启动一个 UnitOfWork 时,我可以使用责任链模式组合它:
public class WithUnitOfWorkHandler<T> : IHandler<T> {
private readonly IHandler<T> _innerHandler;
public WithUnitOfWorkHandler(IHandler<T> innerHandler) {
_innerHandler = innerHandler;
}
public void Handle(T command) {
using(var ouw = new UnitOfWork()) {
_innerHandler.Handle(command);
uow.Commit();
}
}
}
现在我可以通过使用 WithUnitOfWorkHandler
“装饰”它来“链接”任何我的命令处理程序。并且一些处理程序甚至可能涉及多个存储库或聚合。不过,聚合对持久性、工作单元、事务等一无所知。
关于domain-driven-design - 在域层中公开 IUnitOfWork 接口(interface)是否违反持久性无知规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20616829/
出现以下错误: INSERT INTO GroupMembers VALUES ('Goldfrat', 'Simon Palm') * ERROR at line 1: ORA-02291: int
据称以下代码违反了 OO 指导原则。 public class Main { public static String NAME = "James"; public Main() {
我创建了一个名为 EvenementBean 的 EJB 2 进行测试。然后我就把它删除了。现在每当尝试部署我的 .ear 项目时,我都会收到以下错误: WARN [verifier] EJB
我正在开发的一个应用程序正在使用 Oracle 和 Hibernate 作为 ORM。当我尝试插入 PartyUserObject 时,我不断收到以下错误: could not insert: [Pe
我已经实现了一些代码行: if(condition){ Class a = new Class(); method(a.b(), a.c()); }else{ method(null, n
这个问题在这里已经有了答案: Static analysis of noexcept "violations" in C++ (2 个答案) 关闭 4 年前。 我大量使用 noexcept,不幸的是
我有一个 MVVM 应用程序,在我的几个 VM 中,我使用 CollectionViewSource.GetDefaultView(datasource) 来初始化我的 ICollectionView
当我尝试运行我的网站时,它显示 500 internal server error : Internal Server Error The server encountered an internal
运行生存分析,假设变量的 p 值具有统计显着性 - 假设与结果呈正相关。但是,根据 Schoenfeld 残差,违反了比例风险 (PH) 假设。 在纠正 PH 违规后,以下哪种情况可能发生? p 值可
我知道以下是一个主观问题,但您的指导方针确实有助于我追求干净、可测试的代码。 请考虑以下示例,我认为它违反了一系列设计原则。 public class OfferEligibilityCheckerS
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
当我尝试将 Paho MQTT javacrript 与 Mosquito MQTT websockets 一起使用时,只要我用来服务页面的 Web 服务器和 Mosquito 位于同一服务器(同一来
我在通过 hibernate 映射 oracle 时遇到问题 我有这些类(class) Stock.java package com.mc.stock; import java.uti
在我的项目中,我试图解决 Sonar 违规问题,我坚持使用这个,我有以下代码 不允许使用以下属性:语言 谁能告诉我如何解决这个 Sonar 违规问题?我可以简单地删除这种“语言”吗属性还是我应该输
我正在尝试记录唯一标识符,所以我无法承受重复记录我的 ID 当我尝试更新名为 Clients 的 SQL Server 表时,我收到类似这样的错误。 Violation of PRIMARY KEY
我正在尝试实现一个解决方案,以在给定的整数列表中找到第 k 个最大的元素,其中重复项具有 O(N*log(N)) Big-O 表示法的平均时间复杂度,其中 N 是列表中元素的数量。 根据我的理解,合并
如果 tuple_size 模板是一个完整的类型,结构化绑定(bind)特性表示它会像分解一样与元组一起使用。当 std::tuple_size 在程序的某一点是给定类型的完整类型而在另一点不完整时会
我们的应用目前已从 google play 中删除,因为它具有 SMS 权限。我们已经删除了权限并上传了一个新的 apk,但项目的状态仍然是删除。我们是否必须等待他们审核,或者是否需要任何其他必要的步
*i 和 u.i 如何在此代码中打印不同的数字,即使 i 被定义为 int *i = &u.i;?我只能假设我在这里触发了 UB,但我看不出具体情况。 ( 如果我选择“C”作为语言,ideone de
您好,我正在 Oracle SQL dev 中开发一个数据库,它试图从另一个表访问外键。我目前正在处理使用以下 CREATE 语句创建的 ItemOrdered 表 CREATE TABLE Item
我是一名优秀的程序员,十分优秀!