我正在放弃传统的 DDD,这通常会浪费大量时间,并迫使我进行无休止的映射:data layer <--> domain layer <--> presentation layer
.
即使是很小的更改,我也必须更改数据模型、域模型、表示模型/视图模型,然后是存储库、管理器/服务类,当然还有 AutoMapper 映射,然后测试整个事情!每个调用都需要调用一个层,该层调用一个调用底层代码的层。除了“你将来可能需要它”之外,我没有得到任何回报。嗯。
我目前的做法更务实:
- 我不再担心“数据层”和“域层”之间的区别,因为没有意义——这些术语是可以互换的。我让 EF 做这件事,并在需要时在顶部添加接口和存储库。
- 我已经合并了我的“数据”和“域”项目(合并为“核心”,无聊的名字,我知道),我几乎可以发誓 Visual Studio 实际上运行得更快。
- 我允许 EF 实体在堆栈中上下移动,但是,我仍然像往常一样将它们映射到表示模型/视图模型。
- 对于简单的操作,我直接从控制器调用存储库,对于复杂的操作,我照常使用域管理器/服务;存储库从不公开 IQueryable。
- 我将实体/POCO 定义为部分类,因此我可以在相应的部分类中单独添加域行为。
问题:我现在到处都在使用实体,所以客户端代码可以看到它们的导航属性。并且模型总是在离开存储库后被具体化,因此这些导航属性通常为空。
可能的解决方案:
1. 忍受它。这很丑陋,但比上面解释的问题更可取。
2.为每个实体定义一个隐藏导航属性的界面;并使客户端代码使用接口。但具有讽刺意味的是,这意味着另一层(尽管薄且易于管理)。
3. 还有什么?
我不习惯这种快速而松散的编程风格,所以也许我错过了一些明显的技巧。还有什么我应该考虑的吗?我相信我很快就会遇到其他问题。
编辑: 这个问题与 DDD 无关。请注意,许多人都在与传统的 DDD 方法作斗争——Seemann 似乎得出了相同的结论,Rahien 谈到了“为了抽象反模式而进行无用的抽象”,而 Evans 自己说 DDD 仅在 5% 的应用中真正有用案例。另请参阅此线程. 一些评论/答案可以预见地是关于我如何做 DDD 错误,或者我如何调整我的系统以使其正确。但是,我不是在询问 DDD 或在适合的情况下抨击它,而是我想知道其他人在做什么符合我上面描述的想法。并不是说 DDD 是所有设计弊病的灵丹妙药,每十年都会出现一个新流程(RUP 有人吗?XP、敏捷、Booch 等等……)。DDD 只是最闪亮的新版本,也是最知名和最常用的。但是实用主义应该是第一位的,因为我正在尝试构建可按时发货且易于维护的可销售产品。到目前为止,我学到的最有用的编程公理是 YAGNI。我想要的是将我的系统更改为一种“DDD-lite”,在那里我得到了强大的设计/OOP/模式理念,但没有脂肪。