MEF круговая зависимость - PullRequest
3 голосов
/ 17 марта 2012

Предположим, у нас есть два компонента, зависящих друг от друга (косвенно, через интерфейсы):

public interface IAlice { ... }
public interface IBob { ... }

[Export(typeof(IAlice)), PartCreationPolicy(CreationPolicy.NonShared)]
class Alice : IAlice
{
    [Import]
    private IBob Bob { get; set; }
    ...
}

// could be defined in some assembly developed by another team
[Export(typeof(IBob)), PartCreationPolicy(CreationPolicy.NonShared)]
class Bob : IBob
{
    [Import]
    private IAlice Alice { get; set; }
    ...
}

Это приводит к сбою композиции: Сбой композиции, поскольку она не завершилась в течение 100 итераций.Скорее всего, это вызвано циклом в графе зависимостей части, которая помечена политикой неразделенного создания.

Я знаю, что я могу импортировать через объявление Lazy, но таким образом импорт будет создан по требованиюв то время как мне нужно, чтобы моя Алиса ссылалась на Боба, а Боб ссылался на тот же экземпляр Алисы.Я ожидал, что CompositionContainer разрешит такие циклы в рамках одной операции композиции, но, очевидно, это не так.

Я не могу объявить части как общие, так как мне не нужны отдельные Алиса и Боб на контейнер.Мне просто нужно, чтобы такие графы зависимостей создавались как единое целое, когда это делается в одной операции компоновки.Есть ли обходной путь?

UPD.Добавлены некоторые пояснения.

1 Ответ

3 голосов
/ 18 марта 2012

Почему бы не сделать так, чтобы Алиса импортировала IBob посредством инъекции ctor, а затем явно установила свойство Алисы Боба (т. Е. Боб должен не использовать инъекцию свойства для Алисы)?

...