首页 > 解决方案 > 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 组件相关,我应该将它们放在我的项目结构中的什么位置?

标签: domain-driven-design

解决方案


正如@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 元素,因为:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不易扩展(以备将来更改)

推荐阅读