我自己也为此苦苦挣扎。在某些情况下,在演示文稿中使用 DTO 是有意义的。假设我想在我的系统中显示公司的下拉列表,我需要他们的 id 来绑定值。
好吧,而不是加载可能引用订阅或知道其他内容的 CompanyObject,我可以发回带有名称和 ID 的 DTO。恕我直言,这是一个很好的用途。
现在再举一个例子。我有一个代表估计的对象,这个估计可能由劳动力、设备等组成,它可能有很多由用户定义的计算,这些计算将所有这些项目汇总起来(每个估计可能因不同类型而异的计算)。为什么我必须对这个对象建模两次?为什么我不能简单地让我的 UI 枚举计算并显示它们?
我通常不使用 DTO 将我的域层与我的 UI 隔离。我确实使用它们将我的域层与我无法控制的边界隔离开来。有人将导航信息放在他们的业务对象中的想法是荒谬的,不要污染您的业务对象。
有人将验证放在他们的业务对象中的想法?好吧,我说这是一件好事。您的 UI 不应单独负责验证您的业务对象。您的业务层必须进行自己的验证。
为什么要将 UI 生成代码放在业务对象中?在我的情况下,我有单独的对象,它们从 UI 生成 UI 代码 seperatley。我有将我的业务对象呈现为 Xml 的分离对象,您必须分离图层以防止这种类型的污染的想法对我来说是如此陌生,因为您为什么还要将 HTML 生成代码放在业务对象中......
编辑
我想多了,在某些情况下,UI 信息可能属于域层。这可能会使你所谓的域层变得模糊,但我在一个多租户应用程序上工作,它在 UI 外观和功能工作流方面具有非常不同的行为。取决于各种因素。在这种情况下,我们有一个代表租户及其配置的域模型。他们的配置恰好包含 UI 信息(例如通用字段的标签)。
如果我必须设计我的对象以使其具有持久性,我是否还必须复制这些对象?请记住,如果您想添加一个新字段,现在您有两个地方可以添加它。如果您使用 DDD,这可能会引发另一个问题,这些都是持久实体域对象吗?我知道在我的例子中他们是。