【发布时间】:2012-10-10 13:34:36
【问题描述】:
我正在放弃传统的 DDD,这通常会浪费大量时间,并迫使我进行无休止的映射:data layer <--> domain layer <--> presentation layer。
即使是很小的更改,我也必须更改数据模型、域模型、表示模型/视图模型,然后是存储库、管理器/服务类,当然还有 AutoMapper 映射,然后测试整个东西!每个调用都需要调用一个层,该层调用一个调用底层代码的层。 除了“你将来可能需要它”之外,我没有得到任何回报。嗯。
我目前的做法比较务实:
- 我不再担心“数据层”和“域层”之间的区别,因为没有意义 - 术语可以互换。我让 EF 做这件事,并在需要时在顶部添加接口和存储库。
- 我已经合并了我的“数据”和“域”项目(合并到“核心”,无聊的名字,我知道),我几乎可以发誓 Visual Studio 实际上运行得更快。
- 我允许 EF 实体在堆栈中上下移动,但是,我仍然像往常一样将它们映射到表示模型/视图模型。
- 对于简单的操作,我直接从控制器调用存储库,对于复杂的操作,我照常使用域管理器/服务;存储库从不公开 IQueryable。
- 我将实体/POCO 定义为部分类,因此我可以在相应的部分类中单独添加域行为。
问题:我现在到处使用实体,所以客户端代码可以看到它们的导航属性。并且模型总是在离开存储库后实现,因此这些导航属性通常为空。
可能的解决方案:
1. 忍受它。这很丑陋,但比上面解释的问题更可取。
2.为每个实体定义一个隐藏导航属性的界面;并使客户端代码使用接口。但具有讽刺意味的是,这意味着另一层(尽管很薄且易于管理)。
3. 还有什么?
我不习惯这种又快又松的编程风格,所以我可能遗漏了一些明显的技巧。还有什么我应该考虑的吗?我相信我很快就会遇到其他问题。
编辑: 这个问题与 DDD 无关。请注意,许多人与传统的 DDD 方法作斗争——Seemann appears to 到达 the same conclusion、Rahien speaks about the "Useless Abstraction For The Sake Of Abstraction Anti Pattern",而 Evans 本人表示 DDD 仅在 5% 的情况下真正有用。还有see this thread。一些 cmets/answers 可以预见地是关于我如何做 DDD 错误,或者我如何调整我的系统以使其正确。但是,我不是在询问 DDD 或在适合的情况下抨击它,而是我想知道其他人在做什么符合我上面描述的想法。并不是说 DDD 是所有设计弊病的灵丹妙药,每十年都会出现一个新流程(RUP 有人吗?XP、敏捷、Booch 等等……)。 DDD 只是最闪亮的新版本,也是最知名和最常用的。但是实用主义应该是第一位的,因为我正在尝试构建可按时发货且易于维护的可销售产品。 到目前为止,我学到的最有用的编程公理是 YAGNI。 我想要的是将我的系统更改为一种“DDD-lite”,在那里我得到了强大的设计/OOP/模式哲学,但没有胖子。
【问题讨论】:
-
顺便说一句,为什么您在“纯”DDD 方法中有
data layer <--> domain layer映射? DDD 实体应该是 POCO 实体,这使得它们很容易持久化。 -
这只是偏离了我的主要问题,但要回答:在纯 DDD 或各种 DDD 变体中,域模型是从一个或多个数据模型映射的。数据模型是 EF 实体 POCO,但域模型不是(它包含数据和行为)。可能存在语义对应,但这是一种误导,因为它们不是一回事。
-
查看 Eric Evans Blue Book 中的“域对象的生命周期”一章。还有一个 NDDDSaple 项目,您可以在其中看到如何实现持久化没有这个额外的映射。
-
因为没有参考资料而不具建设性? Seemann 的文章"Is Layering Worth the Mapping?" 怎么样?我已经描述了一个其他人也在努力解决的实际问题。
-
我不同意关闭这个问题并投票重新打开它。 @BobbyB:您可以编辑您的问题并将指向Seemann 文章的链接和简短的草图放入您的问题中。在您觉得您的问题符合常见问题解答中的规则后,您可以将其标记为重新打开。
标签: asp.net-mvc entity-framework domain-driven-design poco