2011-11-16 3 views
5

나는 다음과 같이보고 종속성이 코드의 일부를 가지고 : 내 수업에서AutoFac : PropertyWiringFlags.AllowCircularDependencies는 무엇을합니까?

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

에서 볼 수있는 바와 같이 , 내가 가진 순환 의존성을 다음과 같이

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*/) {...} 
} 

내 모듈 구성 본다 나는 ..PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies)..을 사용하여 해결할 수있었습니다.

내 질문 : 이 순환 적 종속성을 해결하기 위해이 플래그가 장면 내에서 정확히 무엇입니까 ??

답변

3

그래프의 나머지 부분이 생성 된 후 건설 시간에서 유형에 대한 속성 주입이 수행되는 시점이 플래그로 변경됩니다. 어떤 종류의 공유 ​​(싱글 톤 또는 요청 당)가있는 사이클의 구성 요소 중 하나 이상을 사용합니다. 플래그가있는 경우에도 모든 구성 요소가 인스턴스마다 종속성을 가지면주기가 계속 존재합니다.

플래그가 없으면 Autofac은 구성 요소의 모든 종속성, 속성 또는 그렇지 않은 구성 요소를 다른 구성 요소가 참조 할 수있게하는 선행 조건으로 간주합니다. 기본값으로 이것은 더 신뢰할 수 있습니다.

+0

Perfect, thx. 나는 당신이 그런 종류의 전략을 적용했다고 생각했지만, 단지 확신하고 싶었습니다. :) – Juri

1

순환 참조를 해결하는 또 다른 좋은 방법은 생성자에서 func에 액세스하지 않는 한 Func<T>에 대한 의존성을 사용하는 것입니다.

+0

이것에 대해 자세히 설명해 주시겠습니까? – Juri

+0

'Lazy '도 작동합니다. 상호 생성자 종속성은 종속성 중 하나가 종속성 유형으로 Lazy/Func를 사용하는 한 작동합니다. –