Oop 用DDD对调度进行建模

Oop 用DDD对调度进行建模,oop,design-patterns,domain-driven-design,Oop,Design Patterns,Domain Driven Design,我正在尝试为我的公司建立一个调度应用程序的模型,可以使用一些建议。如果合适的话,我想采用领域驱动的设计 该领域由一个展示对象组成,该展示对象代表一个我们可能正在推广我们产品的贸易展览、展览或会议。它有开始和结束的日期和时间、议程、发言人名单、地点等。相当多的工作可以通过展会来完成,例如分配发言人、注册与会者、取消等 我们通常作为一个或多个营销活动的一部分参加展会。活动还包括开始和结束日期以及其他信息,以及我们将参加该活动的节目列表。我们可能会在一个特定的展会上推广多个活动 可以从活动中添加或删除

我正在尝试为我的公司建立一个调度应用程序的模型,可以使用一些建议。如果合适的话,我想采用领域驱动的设计

该领域由一个展示对象组成,该展示对象代表一个我们可能正在推广我们产品的贸易展览、展览或会议。它有开始和结束的日期和时间、议程、发言人名单、地点等。相当多的工作可以通过展会来完成,例如分配发言人、注册与会者、取消等

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

可以从活动中添加或删除节目,取消节目时,必须将其从与其关联的任何活动中删除

我的第一个想法是让Schedule aggregate根目录具有包含Show对象列表的活动实体列表。但我需要一种方式来访问独立的节目-一个节目可以与多个活动相关联

看看我的用例,我正在开发一个Silverlight客户端(但也可能是移动的)。主视图将是一个日历类型的UI(如Outlook),它将每个节目显示为约会。还有侧栏,显示即将到来的节目、当前的活动和具有后续任务的节目。双击这些视图中的任何一个项目时,“显示详细信息”将显示在子窗口中

如何在我的应用程序代码中对此域建模,有什么建议吗

但我需要一种方式来访问独立的节目-一个节目可以与多个活动相关联

不要试图将所有内容放在Schedule aggregate root(当您自由谈论域时,在您的语言中不会出现的术语)之下,而是尝试使用2个聚合根-Show和Campaign

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

活动可能没有必要保留引用以显示。如果show知道它所宣传的活动,那么在您显示活动信息时就可以找到它

可以从活动中添加或删除节目,取消节目时,必须将其从与其关联的任何活动中删除

.
应将该节目标记为已取消,必要时活动会将其隐藏

我会从这样的事情开始



正是由于我力求简洁,直到我开始讨论模型,才引入了时间表。事实上,日程安排是应用程序的全部要点。这个时间表代表了所有的演出

很可能存在要求在域模型中引入时间表的需求。但是,由于我还没有听到(或者对你的域名理解不够好),我只想把我的应用程序命名为Scheduler。或者调度程序限制的上下文,如果应用程序不仅仅是关于调度节目和活动


此外,在客户的心目中,该剧并不一定知道这些活动。在我们所有的讨论中,他们只提到为活动分配节目

若Show必须存在于“独立版本”中,那个么它是一个聚合根(按计划向下推它不会改变任何事情,只会增加一个抽象层。Show仍然独立于活动)。如果需要确定在“单机版”中显示的活动与Show关联,则应该有一个关联Show->Campaigns。尽管这可能会让人觉得和域名有点矛盾,但你们可以把它看作是一种牺牲

我们用清晰的原始想法来交换表达自己的能力(这里可以作为一个很好的类比)。毕竟,无论如何,我们不能完全、彻底地捕捉心理模型

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

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

对象的构造和重建之间存在巨大的差异。通常,活动将只构建一次,之后-它将仅从数据存储中重建。如果您确保同一活动的不同实例(从域的角度)不能保存两次,通常这就足够了

这正是我最初的想法,即运动是根源,但这样做忽视了一个现实,即将有不属于运动的节目


哎呀。。。你说得对。

只是因为我尽量简洁,所以直到我开始讨论模型时才介绍了时间表。事实上,日程安排是应用程序的全部要点。节目表代表了所有的节目。而且,在客户心目中,节目并不一定知道活动。在我们所有的讨论中,他们只提到为活动分配节目。从逻辑上讲,我同意你的观点,但我也希望确保分配给它的所有节目只共享一个活动实例。这就是我最初认为活动是根本原因的原因,但这样做忽略了一个事实,即将有不属于活动的节目。不幸的是,由于网络安全限制,我现在无法访问您的链接,但今晚将从家中返回。