У меня есть самый простой вид круговой зависимости в structuremap - класс A полагается на класс B в своем конструкторе, и класс B полагается на класс A в своем конструкторе. Для повреждения зависимости я заставил класс B взять класс A в качестве свойства, а не аргумент конструктора, но structuremap все еще жалуется.
Я видел круговые зависимости, поврежденные с помощью этого метода в других платформах DI - действительно ли это - проблема с Structuremap, или я делаю что-то не так?
Править: Я должен упомянуть, что свойство класса B является массивом экземпляров класса A, обеспеченных электричеством как это:
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
Просто для уточнения я хочу, чтобы следующая последовательность событий произошла:
И я хочу, чтобы все это произошло с помощью автопроводного соединения, если это возможно...
Редактирование 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..."
Самое близкое, что вы можете получить, это что-то вроде этого:
x.For<IB>().Use<B>()
.OnCreation((ctx, instance) =>
{
instance.ArrayOfA = new IA[] {new A(instance) };
});
Если A
имеет другие зависимости, которые требуется разрешить из контейнера, их можно извлечь из ctx
в лямбда OnCreation.
StructureMap, вероятно, выполняет Setter Injection , где он будет заполнять общедоступные устанавливаемые свойства для объекта, который он разрешает. Согласно документации,
По умолчанию все общедоступные «сеттеры» являются необязательными, что означает, что эти сеттеры будут установлены только в том случае, если они явно настроены для определенного экземпляра
. Так вы случайно не настроили свойства для автоматического подключения? Если да, то у вас по-прежнему будет проблема с циклической зависимостью.
Изменить: я вижу, что у вас есть. В вашем случае, поскольку B имеет введенный A [], StructureMap должен разрешить каждую зависимость A для B, которому требуется A [], и так далее ...