XML生成器类的DDD组件

时间:2018-09-25 04:50:25

标签: domain-driven-design

我正在开发基于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组件相关联,并将它们放置在项目结构中的什么位置?

1 个答案:

答案 0 :(得分:0)

正如@Constantin Galbenu在评论中所述,您的XML生成器应位于基础结构层,因为“生成XML”是非特定于应用程序的逻辑。

下一个问题是您将实体直接“映射”到XML以及这些实体有多复杂。

如果给定实体只是一组字段,那么您可以具有通用的一对一关系-即每个实体可以表示为平面XML结构,那么您可以使其针对所有此类实体使用单个入口点工作实体。我指的是您在做的转换。

如果您的实体很复杂并且包含特定的ValueObject,则应该有一种方法可以将数据提取到特定的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属性用于Value Objects的表示形式

<Product>
   <Name>Nm</Name>
   <Description>Desc<Description>
   <Price amount="12.09" currency="EUR"></Price>
</Product>

如果要从Objects到XML进行更复杂的转换,则需要为要转换的每种Object类型都配备一个Transformer。 由于以下原因,我会坚持使用XML元素:

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