Проблемы StructureMap с двунаправленными / циклическими зависимостями - PullRequest
0 голосов
/ 02 мая 2010

В настоящее время я интегрирую 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 Ответ

10 голосов
/ 03 мая 2010

Пациент: "Док, мне больно, когда я тыкаю палец в моих глазах "

Доктор: «Хватит тыкать пальцем в твой глаз. "

Нет, не будет ни «простого», ни «чистого» решения, которое бы поддерживало текущий дизайн. Когда интуиция и ваши инструменты сообщают вам, что дизайн не работает, возможно, стоит послушать.

Если что-то нуждается в IManagerA и IManagerB, то оно должно принимать их обоих как зависимости. Инструмент внедрения зависимостей, такой как StructureMap, упрощает эти типы сценариев композиции - не боритесь с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...