6

유니티 컨테이너에서 해결 한 몇 가지 종속성이있는 클래스를 작성했습니다. 내 메인 클래스에서 Unity register instance and resolve

나는 내 유니티 컨테이너

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

에 등록

MyObject myObject = new MyObject(); 

새로운 객체를 생성 내가 종속성

ConsumerObject consumer = new ConsumerObject(); 
으로 이것을 필요로하는 유형을 생성

소비자는 다음과 같습니다.

종속성의

해상도가 실패 = "MyObject를"유형, 이름 = "": 6,

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

이 예외가 발생합니다. 예외 메시지 : 현재 빌드 작업 (빌드 키 [MyObject, null] 빌드 키 실패) : 생성자 MyObject (IPreferenceStorageProvider pp)를 호출 할 때 매개 변수 pp를 확인할 수 없습니다. (전략 유형 BuildPlanStrategy, 인덱스 3)

왜 내 해결 호출이 해당 유형의 다른 contsructor를 호출하려고합니까?

감사

지금까지 내가 유니티 (기본적으로)하려고 알고

답변

1

가 전화를 .. 어떤 변화를하지 않는 것 theObject = UContainer.Resolve<MyObject>(); : 나는 이미 그것을 만든 나는 또한처럼 그것을 시도 ... 인스턴스를 등록 생성자는 가장 많은 수의 매개 변수를 가지며 매핑의 각 매개 변수를 확인하려고 시도합니다. IPreferenceStorageProvider에 대한 매핑을 추가하거나이 매개 변수가 필요한 생성자를 제거하십시오.

IPreferenceStorageProvider 매개 변수를 단위로 주입하지 않으려면 생성자 매개 변수로 선언해서는 안됩니다. 기본 생성자에서이 객체의 인스턴스화를 하드 코딩 할 수 있습니다.

+2

문제는 "MyObject를이"나의 목적은 .. 그것은 .. 나는 그것을 만들 수 있습니다,하지만 난 그 구조 통제 할 수없는 약 15 생성자가되는입니다 .. 왜 어쨌든 그것을 새롭게하려는 유니티가 있습니까? 나는 인스턴스를 생성하고 그것을 등록했다. 이제는 싱글 톤으로 컨테이너에있다. 생성자를 호출해서는 안된다. ??? –

3

나는 당신이 왜 그런 행동을하고 있는지 잘 모르겠습니다. 방금 시나리오를 복제 한 테스트를 만들었고 정상적으로 작동했습니다.

, 당신이 뭔가를 시도

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

다음 UContainer.Resolve<MyObject>()를 사용 했습니까?

내가 생각할 수있는 유일한 점은 실제로 UContainer.RegisterInstance에 액세스 한 다음 UContainer.Resolve에서 실제로 두 개의 다른 컨테이너에 액세스하는 것입니다. UContainer를 선언하는 방법을 보여줄 수 있습니까?

6

저는 문제가 ExternallyControlledLifetimeManager를 사용하고 있다고 생각합니다. 이 경우 Unity 컨테이너는 인스턴스에 대한 약한 참조 만 보유합니다. 그리고 당신이 해결하려고 할 때 당신의 인스턴스는 이미 가비지 수집됩니다. 이것이 .RegisterInstance()의 기본 LifeTimeManager가 ContainerControlledLifeTimeManager 인 이유입니다. Darrel Miller의 경우에는 GC-ed가 아니기 때문에 작동합니다. 인스턴스이 방법으로 등록하십시오 :

UContainer.RegisterInstance<MyObject>(myObject);