【问题标题】:Organizing multi level aggregate object or composite组织多级聚合对象或组合
【发布时间】:2010-04-20 10:57:18
【问题描述】:

嘿!

我有多个级别的聚合对象。聚合根是网络对象,它具有节点和链接的集合。 Node 和 Link 有 Segment 的集合,Segment 有 Lane 的集合。我的域是交通网络,这只是这个聚合的一部分:

public class Network
{
 private List<Node> nodes;
    private List<Link> links;
}    
public class Node
{
 private Segment segment;

}    
public class Link
{
 private List<Segment> segments;
}    
public class Segment
{
 private List<Lane> lanes;
}
public class Lane
{
 private List<Cell> cells;
}    
public class Cell
{
 private bool IsOccupied;
}

首先,有人能告诉我这样好还是最好将这个聚合分解为三个级别(网络、段、单元),并在这些根上实现存储库模式。

我的问题是我想添加到网络的附加功能。如果该网络将用于模拟,那么模拟器需要车辆源和汇,它们将在网络边缘生成和销毁车辆。我的想法是使该功能脱离网络聚合。这是代码:

public class Simulation
{
 public void Iteration()
 {
  //do something with vehicles
  //foreach sink in sinkRepository call o.Update()

        }

}

public class SinkRepository
{
 private List<Sink> sinks;

 //Singleton pattern

 //+ CRUD operations and GetEnumerator()
}

public class Sink
{
 private int nodeId;
 private List<int> laneIds;

 public void Update()
 {
  //need reference to Network object
  //foreach laneId
  ////network.GetLane(id)
  ////find is cell in lane occupied
         ////if it is then network.SetCellStatus(false);
        }
}

这是一个好方法吗?你有什么建议:) 另外我有一些从 XML 创建网络的持久性代码,它也可以从 XML 创建接收器,但问题是如何优雅地将网络对象的引用传递给接收器 对象,因为 sink 对象需要引用网络,因为它需要根据 laneId 获取车道。

我正在考虑添加网络存储库,并且存储库将是单例的,因此接收器会看到它,而不会在整个生命周期中保持网络抛出的引用。

【问题讨论】:

    标签: oop object repository domain-driven-design aggregate


    【解决方案1】:

    您可以做的更简单一点的事情是在创建接收器时找到正确的车道对象并将它们放入接收器对象中。这会将List&lt;int&gt; laneIds 替换为List&lt;Lanes&gt;。您无需在 Sink 中保留对 Network 的引用,并在每次进行更新时搜索车道列表。

    您仍然需要在 SinkRepository 或更好的 SinkFactory 类中引用 Network 对象,您可以在其中创建新的 Sink 对象并为它们设置正确的通道。

    【讨论】:

    • 好的,但是在 Sink 中保存对 Lane 对象的引用不违反聚合模式吗?
    • 嗯,它可能是。但真正的问题是这个解决方案是否对你更有效。模式是模式而不是法律:)
    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2015-05-04
    • 2018-08-17
    相关资源
    最近更新 更多