Организация многоуровневого агрегатного объекта или составного - PullRequest
0 голосов
/ 20 апреля 2010

Хе!

У меня есть агрегатный объект, имеющий более одного уровня. Совокупный корень - это сетевой объект, в котором есть коллекция узлов и ссылок. Node и Link имеют коллекцию сегментов, а Segment - коллекцию дорожек. Мой домен - сеть трафика, и это только часть этого агрегата:

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.

Я думал о добавлении хранилища в сеть, и хранилище будет одноэлементным, поэтому приемник будет видеть его без сохранения ссылки на бросок сети в течение всего времени жизни.

1 Ответ

0 голосов
/ 20 апреля 2010

Одна вещь, которую вы могли бы сделать, чтобы сделать ее немного проще, - это находить правильные объекты линии, когда вы создаете приемник, и помещать их в объект Sink. Это заменит List<int> laneIds на List<Lanes>. Вам не нужно будет хранить ссылку на Network в Sink и выполнять поиск по списку дорожек при каждом обновлении.

Вам все еще понадобится ссылка на сетевой объект либо в SinkRepository, либо, что еще лучше, в классе SinkFactory, где вы можете создавать новые объекты Sink и устанавливать их с правильными полосами.

...