2016-10-13 1 views
0

Autofac을 사용하여 다음 종속성 주입 시나리오를 달성하려고합니다.Autofac을 사용하여 속성 등록 연기

A, B, P의 세 클래스가 있다고 가정합니다. 클래스 A는 P 타입의 속성을 보유하고 있으며 런타임에 삽입해야하는 B에 대한 참조를 가지고 있습니다. 지금

class B 
{ 
    private P _p; 
} 

가장 중요한 세부 사항 : 동시에

class A 
{ 
    private B _b; 

    public P Prop { get; set; } 

    InitializeProp() 
    { ... } 
} 

, 클래스 B는 P의 예에 따라 어떻게 든 것으로, P.의 인스턴스 그러나 B에 주입 할 필요가 인스턴스는 클래스 A에서 Prop이어야하며 A에서 InitializeProp()이 호출 된 후에 초기화됩니다. InitializeProp()은 A의 생성자보다 나중에 객체의 수명 시간에 호출 될 수 있다고 가정하십시오.

이 시나리오는 Autofac으로 구현할 수 있습니까? B가에 더 해결되면

내가 이런 일을 시도하지만 순환 참조 예외를 얻을, 아마도 :

containerBuilder.RegisterType<A>().SingleInstance(); 

containerBuilder.Register<Func<P>>(c => 
{ 
    var a = c.Resolve<A>(); 
    return() => a.Prop; 
}); 

답변

0

, Autofac보다 똑똑 밝혀 :

class A { public A(B b, P p) { } } 
class B { public B(P p) { } } 

이것은 단순히 다음을 수행 할 수 있기 때문에 완전히 구성 문제를 제거 나는 생각했다.

var a = container.Resolve<A>(); 
a.InitializeProperty(); 
a.Execute(); // calls B 
2

은 registrational 문제를 파악 할 수 있도록, 나는 종종 유용을 구성 찾을 수 원하는 객체 그래프를 코드로 직접 작성합니다. DI 컨테이너의 사용없이, 이것은 당신이 달성하고자하는 것입니다 :

var p = new P(); 
var a = new A(new B(p)) { P = p }; 

당신이 볼 수있는 것은 P의 인스턴스가이를 그래프를 통해 재사용된다는 점이다. 이 지식으로 이제 우리는 당신이 원하는 것을 성취하기 위해해야 ​​할 일을 결정할 수 있습니다.

따라서 해결 방법은 P의 동일한 인스턴스를 다시 사용하도록 Autofac을 구성하는 것입니다. ASingleInstance으로 등록 했으므로 PSingleInstance으로 등록하는 것 외에는 다른 옵션이 없습니다. 그렇지 않으면 Captive Dependency을 처리하게됩니다.

하지만 우리가 뒤로 물러서면 P의 속성이 A 인 이유가 없습니다. 실제로 속성 주입을 사용하는 경우 hardly ever a good reason이 있습니다.

항상 생성자 삽입을 사용해야합니다. 그래서 같이 보일 것입니다 수업은 다음과 같습니다 그래서 결국 나는 그것을 알아 낸

containerBuilder.RegisterType<A>().SingleInstance(); 
containerBuilder.RegisterType<B>().SingleInstance(); 
containerBuilder.RegisterType<P>().SingleInstance(); 
+0

이상적 I : 다음 작업을 수행 할 수있는 메인 프로그램 지금

builder.RegisterType<A>().SingleInstance(); builder.Register(c => { var a = c.Resolve<A>(); return a.Property; }); builder.RegisterType<B>(); 

:

명시 적으로 P의 Func를 등록, 대신이 단순화 등록이 필요하지 않았다 당신이 제안한대로 클래스를 디자인하고, A와 B의 생성자를 통해 P를 주입합니다.그러나 제 실제 시나리오는 다른 종속성에 의해 제약을받으며 짧게 말해 A 클래스의 속성 P를 피할 수있는 방법이 없습니다.이 속성은 A의 수명 기간 중 특정 시점에서 초기화됩니다. A는 프로퍼티 P가 선언 된 인터페이스를 구현합니다. –

관련 문제