У меня есть самый простой вид циклической зависимости в Structuremap - класс A опирается на класс B в своем конструкторе, а класс B опирается на класс A в своем конструкторе. Чтобы разорвать зависимость, я заставил класс B принять класс A как свойство, а не аргумент конструктора, но Structuremap все еще жалуется.
Я видел циклические зависимости, нарушенные с помощью этого метода в других DI-структурах - это проблема с Structuremap или я что-то не так делаю?
Edit:
Я должен упомянуть, что свойство класса B является массивом экземпляров класса A, подключенных так:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Просто чтобы уточнить, я хочу, чтобы произошла следующая последовательность событий:
- Построить экземпляр B, "b"
- Создайте экземпляр A, "a", вставляя "b" в его конструктор
- Установите для "b.ArrayOfA" значение ["a"]
И я хочу, чтобы все это происходило с использованием автопроводки, если это возможно ...
Редактировать 2: Вот упрощенный пример, в котором используется явное подключение:
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
Проверка конфигурации приводит к «Обнаружена проблема двунаправленной зависимости с RequestedType: IocTest2.ILoader ...»