2011-11-28 49 views
1

我正在尝试为我的公司建模一个计划应用程序,并且可以使用一些建议。如果合适,我想遵循域驱动设计。使用DDD建模计划

该域包含一个Show对象,代表一个贸易展览,展览或会议,我们可能会推广我们的产品。它具有开始和结束日期和时间,议程,发言人名单,地点等。可以使用演出完成一些工作,例如分配发言者,注册参与者,取消等。

我们通常作为一个或多个营销活动的一部分参加展会。广告系列还包含开始日期和结束日期以及其他信息,以及我们将参与该广告系列的节目列表。我们可能会在特定的展会上宣传多个广告系列。

可以在广告系列中添加或删除节目,并且在取消节目时,必须从与其关联的任何广告系列中删除节目。

我的第一个想法是将Schedule聚合根与包含Show对象列表的Campaign实体列表进行比较。但是我需要一种访问独立节目的方式 - 一个节目可以与多个广告系列相关联。看看我的用例,我正在开发一个Silverlight客户端(但也可能会移动)。主视图将是一个日历类型的用户界面(如Outlook),将每个显示显示为约会。还有侧栏显示即将进行的节目,当前的广告系列和显示有后续任务。当我在任何这些视图中双击一个项目时,显示细节显示在一个子窗口中。

任何建议如何在我的应用程序代码中建模该域名?

回答

3

但我需要一种方法来访问独立的节目 - 一个节目可以与多个广告系列相关联。

,而不是试图把一切都安排聚合根(长期当你谈论域自由是不会出现在你的语言)下,尝试有2根合计 - 展会和活动。

活动还包含开始和结束日期以及其他信息以及我们将参加该活动的节目列表。

Campaign可能没有必要持有对Show的引用。如果展会知道其宣传的广告系列,那么当您显示广告系列信息时就足以找到它。

可以从广告系列中添加或删除节目,并且在取消节目时,必须从与其关联的任何广告系列中删除节目。

No, it should not
应将显示标记为已取消,如有必要,广告系列将隐藏它。

我会从this之类的东西开始。


那只是因为我试图简明扼要该附表没有出台,直到我开始讨论模型。实际上,时间表是应用程序的全部要点。时间表代表所有节目。

很可能有要求在您的域模型中引入Schedule的要求。但由于我还没有听到它(或不明白你的域名足够好),我只是将我的应用程序命名为Scheduler。或调度程序有界的上下文,如果应用程序不仅仅是关于日程表和活动。

另外,在顾客的意见中,展会不一定了解宣传活动。在我们所有的讨论中,他们只提到将展览分配给广告系列。

如果Show必须存在于“独立版本”中,它是一个聚合根(在Schedule下推下来不会改变事物,这只会增加一个抽象层,Show仍然独立于Campaigns )。如果需要确定Campaign/s Show与“独立版本”中显示的内容相关联,则应该有Show-> Campaigns关联。尽管它可能会对域名感到有点矛盾,但你可以把它看作是一种牺牲。

我们交易能力表达自己与清晰的原创想法(Uncertainty principle可以在这里用作一个很好的比喻)。毕竟,我们无法完全彻底地捕捉心理模型。

从逻辑上说,我同意你的观点,但我也希望确保所有显示已分配给它的活动只有一个实例共享。

您应该关注域对象的生命周期。

对象的构建和重构之间存在巨大差异。通常情况下,Campaign只能构建一次,之后 - 只能从数据存储重建。如果确保同一Campaign的不同实例(从域角度来看)不能两次保存 - 通常就足够了。

这就是我最初认为Campaign是根源的原因,但这样做却忽视了现实,即将会出现不属于Campaign的部分。

Y ...你对此正确。

+0

这只是因为我试图简洁,直到我开始讨论模型时才引入Schedule。实际上,时间表是应用程序的全部要点。时间表代表所有节目。 – SonOfPirate

+0

此外,在客户的意见中,展会不一定了解宣传活动。在我们所有的讨论中,他们只提到将展览分配给广告系列。从逻辑上讲,我同意你的观点,但我也希望确保只有一个Campaign由所有展示共享的实例分配给它。这就是我最初认为Campaign是根源的原因,但这样做却忽略了现实,即不会出现Campaign的一部分。 – SonOfPirate

+0

不幸的是,由于网络安全限制,我现在无法访问您的链接,但今天晚上将从家中返回。 – SonOfPirate