2017-09-18 11 views
1

종속성 주입 컨테이너 (Spring4D)를 사용하여 응용 프로그램을 빌드 할 때 컨테이너가 올바르게 빌드되었는지 알고 싶습니다. 이 상황에서 :종속성 주입 컨테이너 빌드 유효성 확인

TMyForm이 Vcl.Forms.TForm에서 상속 경우 컨테이너가 구축되지만 응용 프로그램이 있기 때문에 사실 TMyForm 전혀 등록되지 않은 작동하지 않습니다
GlobalContainer.RegisterType<TApp>; 
GlobalContainer.RegisterType<TMyForm>; 
GlobalContainer.Build; 

. 빌드 프로세스를 검증 할 수있는 가능성이 있는지 알고 싶습니다. 특히 resolver가 생성자를 해결할 것인데, 디폴트가 아닌가?

은 그 같은 시도 :

var 
    registeredTypes: Spring.Collections.IEnumerable<TComponentModel>; 
    registeredType: TComponentModel; 
begin 
    GlobalContainer.RegisterType<TApp>; 
    GlobalContainer.RegisterType<TMyForm>; 
    GlobalContainer.Build; 

    registeredTypes := GlobalContainer.Kernel.Registry.FindAll; 
    for registeredType in registeredTypes do 
    begin 
     if not GlobalContainer.Kernel.Registry.HasService(registeredType.ComponentTypeInfo) then 
      raise Exception.Create('Build Error'); 
    end; 

을하지만이 이상적인 거리가 멀다.

답변

1

밤에 검색하고 테스트 한 후에 내가 의도 한 바를 달성 할 수있었습니다. 그냥 그렇게 유형을 등록하는 경우 :

GlobalContainer.RegisterType<TApp>; 

컨테이너는 자신이 사용 할 수있는 1 생성자를 사용하여 이러한 유형의 해결됩니다. 당신이 원하는 exaclly이 생성자를 사용하는 컨테이너를 강제로, 당신은 그런 식으로,이 생성자 [주조]를 표시 할 수 있습니다 만들기 해결 생성자를 시도 할 것이다

TApp = class 
private 
    _form: TMyForm; 
    _a: TAppCos; 
public 
    constructor Create; overload; 
    constructor Create(form: TMyForm); overload; 
    [Inject] 
    constructor Create(a: TAppCos); overload; 
end; 
... 
GlobalContainer.RegisterType<TApp>; 

지금 용기 (A : TAppCos)와 그것의 경우 실패 그가 것 "해결할 수 없습니다 : TApp"와 같은 메시지를 표시하십시오 (이전과 같이 다른 것을 사용하지 마십시오). 그리고 이것이 내가 원하는 것입니다.

편집 : TApp 단위에서 사용하려면 Spring.Container.Common을 추가하는 것을 잊지 마십시오.