Циклические зависимости C# в Unity с внедрением Ctor

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

Но я все еще не понимаю. Предположим, следующие классы:

class Feeder : IFeeder    { 
  IManager _MM, 
  Feeder(IManager MM)
  {
     this._MM = MM;
  }
  public void Start()
  {
  ...
  }
  public void Stop()
  {
  ...
  }
  private Propagate()
  {
     _MM.ConsumeFeed()
  }
};

class FeedManager : IManager
{
   IFeeder _Feeder;
   FeedManager(IFeeder Feeder)
   {
      this._Feeder = Feeder;
   }
   public ConsumeFeed()
   {
   ...
   }
   private Shutdown()
   {
      _Feeder.Stop();
   }
   private StartUp()
   {
      _Feeder.Start();
   }
};

Это явно круговая зависимость, поскольку Feeder зависит от FeedManager и наоборот. Я не вижу четкого способа решить это, так как это кажется очень естественным дизайном.

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

Единственный способ решить эту проблему — работать с миллионом событий в приложении или общих объектах? Спасибо за помощь, Юрген


person Juergen    schedule 10.10.2011    source источник


Ответы (1)


Я бы сделал метод IFeeder.Propagate событием, на которое регистрируется экземпляр IManager. Таким образом, у вас нет циклической ссылки.

Ваш пример здесь, кстати, не имеет ничего общего с единством. С моей точки зрения, это больше проблема дизайна, чем проблема единства.

person PVitt    schedule 10.10.2011
comment
Да, это проблема дизайна. Дело в том, что Unity использует инъекцию Ctor, и ее можно преодолеть с помощью правильной инъекции (механизм отложенной реализации). В общем, чтобы избежать этого, используйте события. Но, как я уже сказал, я хочу избежать миллиона событий в приложении. - person Juergen; 10.10.2011
comment
Почему вы хотите избежать событий? С моей точки зрения, нет причин избегать событий. - person PVitt; 10.10.2011
comment
Предположим, что FeedManager также вызывает событие, которое должно быть обработано Feeder. Затем снова возникает циклическая зависимость. В этом случае будет ли решение использовать агрегатор событий? - person Juergen; 10.10.2011
comment
Тогда вы совершили ту же ошибку. Объекты обычно имеют иерархию. Один родитель, другой ребенок. Родитель звонит ребенку, но ребенок никогда не звонит родителю. Если родитель заинтересован в том, что происходит с дочерним объектом, он должен зарегистрироваться на события, указывающие на эти события. Пожалуйста, не поймите меня неправильно, но я чувствую, что вам следует сначала взглянуть на некоторые основы ООП. - person PVitt; 10.10.2011