#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. Тогда вы допустили ту же ошибку. Объекты обычно имеют иерархию. Один является родительским, другой — дочерним. Родительский элемент вызывает дочерний элемент, но дочерний элемент никогда не вызывает родительский элемент. Если родительский элемент заинтересован в том, что происходит с дочерним объектом, он должен зарегистрироваться для событий, которые указывают на эти события. Пожалуйста, не поймите меня неправильно, но я чувствую, что сначала вам следует ознакомиться с некоторыми основами ООП.