从概念上讲,我有以下对象:
ItemGroup = (GroupId, Name, Item list)
ItemActor (ItemId) : Get() -> returns ItemContract { ItemId, Name, Color }
让我们假装的项目可以属于多个组,并且项目标识和ItemActor是必需的。
对于有状态的演员,我有这个:
ItemGroupActor (GroupId) : Get() -> returns GroupContract { GroupId, Name, List< ItemContract > }
以下是问题:
GroupActor是否只保留ItemIds,并强制其他人为ItemContracts调用每个ItemActor(在循环中)?
或者GroupActor是否保留所有项目详细信息并监听项目更改事件以使其数据保持最新(如视图)?
还是有第三个&#34; ViewActor&#34;谁将数据编译在一起,调用ItemActors(循环),并听取事件以使其数据保持最新状态?
还是其他什么?
这些选项都没有让我觉得特别有吸引力,因为它们要么需要循环演员调用,要么通过事件进行高维护项目管理。
是否有一些指导方针可以让我以某种方式向我保证,或者对这种情况采取一般方法?
答案 0 :(得分:1)
1)您应该能够通过其ID直接从相应的actor中检索ItemContract。并直接通过他们的演员对这些项目进行任何更改,否则我不明白决定在这里使用演员进行ItemContract。
2)这是可能的,但看起来像Reliable Service是一个更好的收藏。即使对于事件,Actor也将是单线程的,因此您不会同时处理更新。这将导致糟糕的表现。
3)只需调用ItemContract的任何一个actor并用于提供ItemContracts的更新,并让任何负责ItemGroup的单个actor被调用并仅用于组。
考虑任务 - 您不必使用循环,您可以与actor(至少检索其状态)并行使用。
考虑将Group actor映射到Item actor的第三个服务。只是映射。没有状态更新,没有事件跟踪。但是,想要警告你,将列表存储在任何类型的可靠字典中都是一个坏主意。