2010-04-20 41 views
0

惠!组织多级聚合对象或复合

我有聚合对象有多个级别。聚合根是网络对象,它具有节点和链接的集合。节点和链接有段的集合,段有车道的集合。我的领域是交通网络而这仅是该集合的一部分:

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

我在考虑添加网络存储库和存储库将是单身,所以下沉会看到它保持参考网络抛出整个一生。

回答

0

你可以做的一件事就是找到正确的车道对象,每当你创建一个水槽并把它们放到水槽对象中。这将取代List<int> laneIdsList<Lanes>。您不需要在Sink中对Network进行参考,并在每次更新时搜索通道列表。

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

+0

好吧,但是不会违背集合模式来保存对Sink中Lane对象的引用吗? – Vedran 2010-04-21 15:34:44

+0

好吧,它可能是。但真正的问题是这个解决方案对你有没有效。模式是模式不是法律:) – derdo 2010-04-21 16:11:26