- 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/
例如 Form1 frm1 = new Form1(); TextBox tb = new TextBox(); frm1.Controls.Add(tb); 现在我不能说 f
我有一个日期过滤器,我已经在我的 View 中公开了它。我想让界面更加用户友好并加强它的外观。我不想选择日期,而是从以下选项中进行选择。 最后一天 上周 去年 全部 然后,这将过滤日期字段。这可能吗?
如何向用户公开我的用户控件组件之一的 ActualWidth 属性? 我找到了很多关于如何通过创建新的依赖属性和绑定(bind)来公开普通属性的示例,但没有关于如何公开像 ActualWidth 这样
Github 最近推出了项目功能。 当项目处于 repo 级别时,如果 repo 本身是公开的,那么任何人都可以访问这些项目。 但是,组织级别的项目仅对组织成员可见。 例如,https://githu
我想要从我的网络服务器访问 JavaScript 文件。 以便任何人都可以在其网站中访问和引用它。 e-g 假设 abcxyzserver.com 是我的网络服务器。 www.abcxyzserv
尝试使用curl命令上传到blob存储 curl --upload-file --url "https://.blob.core.windows.net//" 但不断收到“HTTP/1.1 404
我正在尝试获取 Canvas 的上下文,显然我收到错误Uncaught TypeError: Cannot call method 'getContext' of null 显然我在它初始化之前就得到
我正在对设置 HA 集群的解决方案进行故障排除。虽然我知道应用程序执行故障转移和故障回复所需的端口,但不知何故 dockerized 解决方案不起作用。我怀疑有一些我还不知道的端口。 目前,我的 EX
我试图在能够使用 Helm 运行的k8集群中设置Prometheus。当我使用外部IP将Prometheus-Server作为LoadBalancer服务公开时,访问仪表板。 当我尝试将此服务配置为C
我知道关于这个主题也有类似的问题,但我不完全确定他们正在解决同样的问题。所以要明确的是... 我有一个现有的类库,其中包含用于类型、业务逻辑和数据访问的命名空间。逻辑和数据访问命名空间中的类是静态的,
尝试使用curl命令上传到blob存储 curl --upload-file --url "https://.blob.core.windows.net//" 但不断收到“HTTP/1.1 404
1.)执行以下命令生成一个随机数,用于后面的步骤 NUMBER=$[ ( $RANDOM % 1000 ) + 1 ] echo $NUMBER 注意:将句子 your random number 替
类似这样的问题有很多,但仍然无法得到我真正想要的,而且它们都有一些与我不同的地方,那就是:我有一个 UserControl: 在名为UCProject 的类库项目中单独构建; UCProject 项目
我有一个这样的基类: public class BaseModalCommand { protected object m_commandArgument; protected i
给定以下 JQuery 插件。是否可以将变量“元素”公开给插件外部的 javascript?如果是这样,这是怎么做到的?对于此插件外部的 javascript,访问“元素”的语法是什么? (funct
我有两个使用 jhipster 创建的微服务。 (ms1 和 ms2) 我使用 AuthorizedFeignClient 在两个微服务之间进行通信。 ms1 有一些 DTO 类,用作 REST AP
我正在使用错误跟踪软件来报告网络浏览器中发生的任何错误,但我的生产站点上的代码已缩小。因此,调试几乎是不可能的(变量名被更改等)。 我想将完整的源映射文件投入生产,以便我可以调试这些错误,但在这样做时
我在 Kotlin 公开库中可以找到的所有 Material 都假定该表具有一个主标识列,因此在大多数示例中显示的实体继承了 IntEntity 抽象类。例如: class UserLocation(
我有一个类 (Capsule),它有很多 protected 方法 (30+)。这个想法是允许开发人员扩展此类并在类 (ImADev) 中使用 protected 方法,但将其留给开发人员将它们公开为
Tomcat 日志位置是: /apache/apache-tomcat-8.0.15/logs 允许通过浏览器访问这些日志的标准方法是什么? 为此启用 Tomcat 目录列表标准吗? 最佳答案 我曾在
我是一名优秀的程序员,十分优秀!