Предположим, у нас есть два компонента, зависящих друг от друга (косвенно, через интерфейсы):
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» итераций. Это, скорее всего, вызвано циклом в графе зависимостей части, которая помечена политикой создания без общего доступа.
Я знаю, что могу импортировать через ленивое объявление, но таким образом импорт будет создаваться по запросу, в то время как мне нужно, чтобы моя Алиса ссылалась на Боба, а Боб ссылался на один и тот же экземпляр Алисы. Я ожидал, что CompositionContainer разрешит такие циклы в рамках одной операции композиции, но, видимо, это не так.
Я не могу объявить части как общие, так как мне не нужны отдельные Алиса и Боб для каждого контейнера. Мне просто нужно, чтобы такие графы зависимостей создавались как единое целое, когда это делается за одну операцию композиции. Есть ли обходной путь?
УПД. Добавил некоторые уточнения.