Проблемы StructureMap с двунаправленными / циклическими зависимостями
В настоящее время я интегрирую StructureMap в наш бизнес-уровень, но у меня есть проблемы из-за двунаправленных зависимостей.
Уровень содержит несколько менеджеров, где каждый менеджер может вызывать методы друг друга: нет никаких ограничений или правил для общения. Это также включает в себя возможные циклические зависимости, как в примере ниже. Я знаю, что сама конструкция сомнительна, но в настоящее время мы просто хотим, чтобы StructureMap работал и сосредоточится на дальнейшем рефакторинге в будущем.
Каждый менеджер реализует IManager
интерфейс:
internal interface IManager
{
bool IsStarted { get; }
void Start();
void Stop();
}
А также имеет свой специфический интерфейс:
internal interface IManagerA : IManager
{
void ALogic();
}
internal interface IManagerB : IManager
{
void BLogic();
}
Вот две реализации фиктивного менеджера:
internal class ManagerA : IManagerA
{
public IManagerB ManagerB { get; set; }
public void ALogic() { }
public bool IsStarted { get; private set; }
public void Start() { }
public void Stop() { }
}
internal class ManagerB : IManagerB
{
public IManagerA ManagerA { get; set; }
public void BLogic() { }
public bool IsStarted { get; private set; }
public void Start() { }
public void Stop() { }
}
Вот конфигурация StructureMap, которую я использую в данный момент.
Я все еще не уверен, как мне зарегистрировать менеджеров, поэтому в настоящее время я использую ручную регистрацию. Может быть, кто-то может помочь мне с этим тоже.
For<IManagerA>().Singleton().Use<ManagerA>();
For<IManagerB>().Singleton().Use<ManagerB>();
SetAllProperties(convention =>
{
// configure the property injection for all managers
convention.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType));
});
Ведь я не могу создать IManagerA
потому что StructureMap жалуется на круговую зависимость между ManagerA
а также ManagerB
, Есть ли простое и чистое решение, чтобы решить эту проблему, но сохранить текущий дизайн?
1 ответ
Пациент: "Док, мне больно, когда я засовываю палец в глаз"
Доктор: "Хватит тыкать пальцем в глаз".
Нет, не будет ни "простого", ни "чистого" решения, которое бы поддерживало текущий дизайн. Когда интуиция и ваши инструменты сообщают вам, что дизайн не работает, возможно, это хорошая идея для прослушивания.
Если что-то нужно IManagerA
и IManagerB
, тогда он должен принять их обоих как зависимости. Инструмент внедрения зависимостей, такой как StructureMap, упрощает эти типы сценариев композиции - не боритесь с этим.