Круговые зависимости в StructureMap - они могут быть повреждены с инжекцией свойства?

У меня есть самый простой вид круговой зависимости в structuremap - класс A полагается на класс B в своем конструкторе, и класс B полагается на класс A в своем конструкторе. Для повреждения зависимости я заставил класс B взять класс A в качестве свойства, а не аргумент конструктора, но structuremap все еще жалуется.

Я видел круговые зависимости, поврежденные с помощью этого метода в других платформах DI - действительно ли это - проблема с Structuremap, или я делаю что-то не так?

Править: Я должен упомянуть, что свойство класса 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..."

9
задан Andy 10 May 2010 в 08:56
поделиться

2 ответа

Самое близкое, что вы можете получить, это что-то вроде этого:

x.For<IB>().Use<B>()
    .OnCreation((ctx, instance) =>
    {
        instance.ArrayOfA = new IA[] {new A(instance) };
    });

Если A имеет другие зависимости, которые требуется разрешить из контейнера, их можно извлечь из ctx в лямбда OnCreation.

3
ответ дан 4 December 2019 в 21:08
поделиться

StructureMap, вероятно, выполняет Setter Injection , где он будет заполнять общедоступные устанавливаемые свойства для объекта, который он разрешает. Согласно документации,

По умолчанию все общедоступные «сеттеры» являются необязательными, что означает, что эти сеттеры будут установлены только в том случае, если они явно настроены для определенного экземпляра

. Так вы случайно не настроили свойства для автоматического подключения? Если да, то у вас по-прежнему будет проблема с циклической зависимостью.

Изменить: я вижу, что у вас есть. В вашем случае, поскольку B имеет введенный A [], StructureMap должен разрешить каждую зависимость A для B, которому требуется A [], и так далее ...

1
ответ дан 4 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: