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

#c# #unity-container #prism #circular-dependency

#c# #unity-контейнер #призма #циклическая зависимость

Вопрос:

Я знаю, что проблема циклических зависимостей в контексте внедрения зависимостей с помощью 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();
   }
};
  

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

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

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

Ответ №1:

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

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

Комментарии:

1. Да, это проблема дизайна. Дело в том, что unity использует внедрение Ctor и его возможности для преодоления этого с помощью надлежащего внедрения (механизм отложенного создания экземпляра). Итак, в общем, чтобы избежать этого, используйте события. Но, как я уже сказал, я хочу избежать миллиона событий в приложении.

2. Почему вы хотите избежать событий? С моей точки зрения, нет причин избегать событий.

3. Предположим, что FeedManager также вызывает событие, которое должно быть использовано фидером. Затем снова возникает циклическая зависимость. В этом случае будет ли решением eventaggregator?

4. Тогда вы допустили ту же ошибку. Объекты обычно имеют иерархию. Один является родительским, другой — дочерним. Родительский элемент вызывает дочерний элемент, но дочерний элемент никогда не вызывает родительский элемент. Если родительский элемент заинтересован в том, что происходит с дочерним объектом, он должен зарегистрироваться для событий, которые указывают на эти события. Пожалуйста, не поймите меня неправильно, но я чувствую, что сначала вам следует ознакомиться с некоторыми основами ООП.