组织多级聚合对象或复合

时间:2010-04-20 10:57:19

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

惠!

我有一个具有多个级别的Aggregate对象。聚合根是网络对象,它具有节点和链接的集合。 Node和Link包含Segments的集合,Segment包含Lanes的集合。我的域名是流量网络,这只是这个聚合的一部分:

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创建接收器,但问题是如何优先传递网络对象的接收引用 object因为sink对象需要引用网络,因为它需要根据laneId获取lane。

我正在考虑添加网络存储库和存储库将是单例,因此接收器会看到它在网络上保持引用整个生命周期。

1 个答案:

答案 0 :(得分:0)

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

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