AutoFac: Что делает PropertyWiringFlags.AllowCircularDependencies? - PullRequest
5 голосов
/ 16 ноября 2011

У меня есть часть кода с зависимостями, которые выглядят следующим образом:

public class MyPage : Page //ASPX WebForms page
{
    public IPersonBl PersonBl { get; set; }

}

public class PersonBl : IPersonBl
{

    public PersonBl(ISomeMagicBl magicBl){...}

}

public class SomeMagicBl : ISomeMagicBl
{
    public IPersonBl PersonBl { get; set; }

    public SomeMagicBl(/*Other dependencies*/) {...}
}

Моя конфигурация модуля выглядит следующим образом

...
builder.RegisterAssemblyTypes(ThisAssembly).Where(t => t.Name.EndsWith("BL")).AsImplementedInterfaces().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).InstancePerLifetimeScope();
...

Как видно, у меня есть циклические зависимости в моих классах, которые мне удалось разрешить с помощью ..PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies)...

Мой вопрос : Что именно делает этот флаг за кулисами, чтобы решить эти циклическиезависимости ??

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Флаг изменяет точку, в которой выполняется внедрение свойства для типа, от времени построения до после создания остальной части графика.Он опирается на один или несколько компонентов в цикле, имеющих некоторый вид совместного использования (синглтон или на запрос) - даже с флагом, если все компоненты являются экземплярами на основе зависимости, тогда цикл все равно будет существовать.

Без флага Autofac считает, что все зависимости компонента, свойства или нет, являются необходимыми условиями, чтобы позволить любому другому компоненту получить ссылку на него.По умолчанию это более надежно.

1 голос
/ 16 ноября 2011

просто для справки, еще один хороший способ разрешить циклическую зависимость - взять зависимость от Func<T>, если вы не обращаетесь к функции в конструкторе.

...