实施领域驱动设计

10

是否有人正在使用领域驱动设计(Domain Driven Design)的技术?我最近读了同名的Eric Evans书籍(大部分内容!),很想听听那些在项目中实施所有/部分领域驱动设计技术的人的经验(特别是在C#/C++中)。

我保持这个问题是开放性的,因为我希望看到尽可能多的评论,但我有一些特别的问题:

1 - 如果语言支持,值类型是否应该是真正的“值类型”?例如C#中的结构体。

2- 在C#中是否有任何功能能够更清晰地表明语言与模型之间的关联(例如,这是一个实体,这是一个聚合等)

4个回答

6

是的!我在我的项目中使用DDD(但我有偏见!)

请记住,领域驱动设计提供的是指导方针,而不是严格的答案。只有在实验后,您才会了解哪些方面适用于您特定的项目。

回答您的问题:

1 - 您可以使用结构体-但可能存在技术限制,阻止您使用它们。例如,您可能有引用数千个值对象的实体,这些值对象恰好具有相同的值。在这种情况下,最好使用轻量级对象来保持内存使用

2 - 我建议使用接口(例如IEntityIValueObjectIAggregateRootISpecification)。泛型和LINQ可以帮助解决技术问题,但从设计角度来看,它们的帮助较少。

我创建了一个免费的.NET库,专门关注DDD,可能会从中获得想法/灵感。[在此处阅读更多信息。](项目已死)

但我真的很感兴趣:您认为DDD的哪些方面会对您有益?“领域驱动”方面还是实现方面?


我也一样,链接还是失效的。 - mfeineis
抱歉,伙计们,这个项目已经死了一段时间了。 - Vijay Patel

3

1: 取决于。在C#中,值类型是用于原子基元(int、byte等)的。如果你有这样的东西,那么它是有意义的。如果你的值类型更大,那就不行。

2: 不行。通常情况下,这不是语言特性。

我建议接下来阅读:Scott Ambler的“构建可工作的对象应用程序”。


2

1 - 如果语言支持,值类型是否应该成为真正的“值类型”?

我认为答案取决于您的应用程序中的使用和其他因素,但您可能正在寻找的模式是“数据传输对象”,它具有属性、getter和setter,但没有其他内容。它可以是结构体或对象,而对象可能会简化内存管理问题,特别是关于装箱的问题。

2- 在C#中是否有任何功能可以更清晰地表明语言和模型之间的关联(例如,这是实体,这是聚合等)

我会使用命名约定,例如“CustomerEntity”,“OrderAggregate”等。

好问题;我期待看到回复。


1

1 - 如果语言支持,值类型是否应该是真正的“值类型”?例如C#中的结构体

不要混淆DDD中的“值对象”和CLR中的“值类型”(C#中的结构体)。前者与设计有关,而后者是一个更低级别的实现考虑,实际上与内存管理有更多关系。

2 - 在C#中是否有任何功能可以更清晰地表明语言和模型之间的关联(例如,这是一个实体,这是一个聚合等)

在处理实体与值时,是的。我们发现在DDD中使用C#中的readonly非常有助于实现值对象。我们正在大力推广DDD,我会不时在Pluralsight博客上发布相关内容。事实上,我已经安排了两篇关于readonly和DDD的博客文章将在本周晚些时候发布。

[1] http://blog.pluralsight.com/tag/ddd/


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