domain-driven-design - XML 生成器类的 DDD 组件
问题描述
我正在开发一个基于 DDD 原则构建的应用程序,以下是项目结构。
App (Background task)
--> DomainEventHandlers
-->SomeDomnainEventHandler.cs
Domain (Class library)
--> Models
--> SomeAggregate.cs
--> SomeEntity.cs
--> SomeValueObject.cs
Event
--> SomeDomainEvent.cs
当 SomeDomnainEvent 被触发时,SomeDomnainEventHandler.cs
通过中介调用。在我的SomeDomnainEventHandler.cs
我试图将我SomeEntity.cs
映射到一个 XML 映射器类以生成 XML 消息。
我的问题是,我的 XML 映射器类和 XML 消息生成器与哪个 DDD 组件相关,我应该将它们放在我的项目结构中的什么位置?
解决方案
正如@Constantin Galbenu 在评论中所说,您的 XML 生成器应该在基础设施层中,因为“生成 XML”是非应用程序特定的逻辑。
下一个问题是您是否将您的实体直接“映射”到 XML 以及这些实体有多复杂。
如果给定的实体只是一组字段,您可以有一个通用的一对一关系 - 即每个实体都可以表示为一个平面 XML 结构,那么您可以使其与所有此类实体的单个入口点一起工作。我将您正在做的事情称为 s 转换。
如果您的实体很复杂并且包含特定的值对象,那么您应该有一种方法可以将该数据提取到特定的 XML 结构中。
实际上,我不想谈论“映射”,因为当您拥有包含许多 ValueObjects 并引用其他实体的实体时可能会涉及到复杂性。加上 VO 可以避免在域的其他场景中的对象之间的映射。
我可以在脑海中看到一个简单的说明性示例:
Product has the following properties:
Name (String)
Description (String)
Price (Money Value Object)
Amount (Decimal or integer internally)
Currency ()
这可以用 XML 表示:
<Product>
<Name>Nm</Name>
<Description>Desc<Description>
<Price>
<Amount>12.09</Amount>
<Currency>EUR</Currency>
</Price>
</Product>
或者您可以将 XML 属性用于值对象的表示:
<Product>
<Name>Nm</Name>
<Description>Desc<Description>
<Price amount="12.09" currency="EUR"></Price>
</Product>
如果您想要从 Objects 到 XML 的更复杂的转换,您需要为要转换的每个 Object 类型都有一个 Transformer。我个人会坚持使用 XML 元素,因为:
- 属性不能包含多个值(元素可以)
- 属性不能包含树结构(元素可以)
- 属性不易扩展(以备将来更改)
推荐阅读
- ignite - Ignite 中与 checkPointPageBufferSize 和 WalAutoArchiveAfterInactivity 相关的问题
- laravel - 如何在 Laravel 的配置文件中返回一个数组
- java - 数据库事务与 Java 线程
- c# - llbl gen group by with conditional sum 无法绑定错误
- javascript - 无法在 Jquery innerHtml 中动态编写 html
- java - 如何在 android 的 KeyBoardView 中设置行的重力?
- c# - TelegramBot 400 错误请求:找不到媒体
- java - [Java]为什么初始for循环以索引i = 0开始后在else条件下中断
- javascript - 为什么 JavaScript 代码会更改“'”字符
- reactjs - 将数据从 MongoDB 存储到状态 - 最佳选择