领域对象应该实现IXmlSerializable吗?

3
我正在构建一个REST API,将数据作为XML暴露出来。在我的领域层中有很多领域类,旨在供API后面的服务层和我们提供给客户端API使用(客户有直接与REST API交互的选项,但客户端API简化了操作)。我希望保持我的领域类不受任何数据持久性逻辑的影响,但我正在努力尝试弄清楚是否可以让领域类实现IXmlSerializable来简化通过API公开和检索的数据序列化过程。一开始我想保持领域类不包含任何序列化逻辑,而是使用序列化行为对其进行修饰,例如将领域对象包装在处理序列化的对象中。我这样做是否会让事情变得更加复杂?您对我应该如何处理此问题有什么想法吗?谢谢!
1个回答

5

域类应该只关注业务逻辑,而不是持久化或序列化。

您应该创建一组数据传输对象(DTO)类,每个类对应一个域类。这些类仅包含您决定公开的来自域类的属性。这使得域类可以拥有未通过持久化或序列化层公开的属性。

只有DTO对象会被序列化和反序列化。

然后,您可能会发现创建静态的“翻译”方法以在域和DTO对象之间进行转换非常方便。


你的序列化层会是什么样子?你会编写接受DTO并将其输出为XML的方法吗?还是您会采取流并将其序列化到其中? - csano
这取决于我所需要的情况。我倾向于遵循.NET中许多基于XML的API的模式,并接受XmlWriter作为目标。如果我发现调用代码反复从流创建XmlWriter,我会添加一个接受流的重载。如果我发现调用代码使用XPathNavigator.AppendChild来创建XmlWriter,那么我会编写一个接受IXmlNavigable的重载,等等。 - John Saunders
这个概念听起来很不错 - 是否最简单的方法是让域对象及其对应的DTO都实现相同的仅属性接口,并且DTO的构造函数接受该接口的实例(该实例为域对象实例)? - Jesse C. Slicer
我不认为在这里使用仅限属性的接口有任何价值。据我所见,它不会节省任何代码。 - John Saunders
将合同表示为DTO或XML的真正区别是什么?它们不都只是数据的不同表示形式,没有任何行为吗?我知道DTO具有类型安全性,但它们也需要编写更多的代码。 - jpierson
他们需要编写更多的代码 - 除非不需要。代码可以生成。此外,不要假设访问XML需要更少的代码 - 实际上可能需要更多的代码来访问它。DTO至少可以集中访问代码,然后可以重复使用。另一种选择可能是在必须访问XML的每个地方编写XML访问代码。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接