建筑分析有助于新项目

时间:2012-05-12 01:48:55

标签: architecture nosql domain-driven-design ravendb aggregateroot

http://i.stack.imgur.com/YZXZN.png(我目前不允许嵌入图片)

我真的可以在上面的班级模型中使用一些帮助。我很惭愧地说,我是那些在大学里学习面向对象的“开发人员”之一,写了考试,然后开始考试,但从未在我的真实世界代码中实现这些原则。在开始编写之前,我从未真正坐下来考虑我的应用程序设计。因此,在整体遗留银行应用程序开发和维护的重压下,我的设计和编码技能一直在慢慢消亡和停滞不前。经过多年的努力,我决定绝对是改变的时候了!我一直在深入研究设计模式,DDD,NoSQL,DI等世界。过去两周对我来说是一次非常激烈的体验,有时我觉得我的体积几乎让我大开眼界我在大公司和银行工作时错过的最佳实践和技术。我简直无法相信我已经从最前沿的技术和良好的设计方法中走了多久,突然间一切都被威胁到让我陷入编码瘫痪状态!我根本无法开始编码,因为我觉得我的设计需要更多调整,或者我需要更多地研究特定主题。足够了,我需要破解并至少对项目进行第一次迭代。

无论如何,在我的问题上有足够的戏剧性:

我已开始为我的高尔夫应用程序创建模型。想要在某种程度上坚持DDD并且想要使用NoSQL(RavenDB),我开始考虑以下要求。

  • 我的平台堆栈是Windows / IIS / MVC 3.0 / RavenDB
  • 我需要找到我的根源!我已经着手将它们定义为我系统中唯一能够持久保存的元素。其他所有我只是认为聚合的“子组件”。请注意,尚未定义任何实际行为。
  • 我的聚合根将是唯一一个实际存在于我的RavenDB文档商店中的类,它们将“按原样”保留。在实现性能优势方面,拥有大型树状类结构似乎是RavenDB的最佳案例场景。
  • 我觉得不需要存储库层(一直关注Ayende的一些帖子),因为RavenDB API感觉流畅且非常轻量级。我只需要在控制器上通过自定义操作属性打开和关闭我的会话。我已经看到,没有存储库层测试可能会很棘手,但我当然应该能够简单地模拟一些“内存中”域对象?
  • 写入数据库将发生在单独的服务层
  • 有一次,我停下来问自己:“我到底想把我的域名行为放在哪里!?”。搜索网络的一般共识似乎表明我应该让我的域(实体)没有任何行为(业务逻辑),并将其全部处理在我的服务层中。但在阅读了一些Eric Evans之后,我确信我的域名行为应该存在于那里......在域名中!

问题   - 作为DDD和建筑设计领域的真正菜鸟,我至少在正确的轨道上,还是我注定要毁灭?   - 任何想法,劝告,建设性的批评和对上述内容的见解将不胜感激!

3 个答案:

答案 0 :(得分:3)

要反对过度学习这一切并且长时间陷入分析:首先让它发挥作用。然后把它漂亮。

尽可能将行为放在数据附近。使用服务,如果你不能干净地将责任分配给一个类(例如,如果'转移资金'方法应该在SavingsAccount类上?)。服务可以是聚合的一部分。

使用存储库(我不同意Ayende)。您提到使用单独的服务层进行数据库写入。存储库是将该层放在后面的完美界面。它也是一个完美的测试缝。

没有彻底查看你的类图,但你可能在这里和那里过度使用继承。赞成合成而不是继承。继承可以很快地让它变得丑陋。

选择聚合根时,一个重要的标准是生命周期。当聚合根死亡时,聚合中的其他所有内容也会消失。聚合根也在控制之中,聚合之外的所有内容都通过它。如果有疑问,只需创建很多(单实体聚合)。对于文档数据库,您通常会按聚合存储文档,因此这与您选择它们​​的方式有所不同。存储对不同聚合的引用的ID。

答案 1 :(得分:0)

所以是的,沿着兔子洞走下去不会在短期内提高你的生产力,但可能会帮助你长期成长为开发者。 DDD,NoSQL等有很多东西你可以花多年时间学习。

如果你想让你的下一个项目取得成功,我的建议是坚持你所知道的,并逐步引入新技术,这样你总能感受到完全控制,而不是依赖于某人的“最佳实践”。忍住了。

答案 2 :(得分:0)

首先,请允许我祝贺你决定采取措施,努力变得更专业。我对这个行业缺乏职业感到绝望,有时候我觉得自己走的是80%的牛仔/黑客20%的专业人士。

问题:

  • 你读过Vaughn Veron的this article吗?如果没有,你应该。它提供了一个优秀的指南来设计聚合,我认为它的复杂性被低估了。
  • 看看你的模型,我不确定你是否确实定义了聚合?我可以看到您已识别聚合,但聚合应具有明确的边界并与其他聚合分开(即,没有引用其他聚合根的实体,让它们引用它们的ID)。属性名称​​ RefereeUserIDList 暗示您实际上正在执行此操作,但该图表显示它持有对实际“用户”聚合根的引用?
  • 在识别聚合物方面。根与...模型设计,我真的不认为我们可以在这里帮助你,因为这完全是对行为要求的间接要求。我会说:尝试将您的设计基于行为,而不是数据结构。转移到这是一种困难的心态,但不要试图描绘数据库结构。
  • 我还没有读过Ayende关于存储库的说法,但只要你能模仿Raven API(我假设你可以给他制作Rhino模拟)那么它应该不是问题。
  • 可能最重要的是,不要将所有域逻辑放入服务层。你最终得到一个Anemic domain model,这是与反基督相当的DDD。
  • 在学习DDD时我个人理解所有校长,但在尝试将理论付诸实践时却很挣扎。如果我是诚实的,我会说我只是真的成功了,因为我理解了赞美DDD的校长CQRS。我真的建议Greg Young观看一些关于这个主题的视频。