2017-09-18 2 views
1

依存性注入コンテナ(Spring4D)を使用してアプリケーションをビルドするとき、コンテナが正しく構築されているかどうかを知りたいと思います。このような状況で:TMyFormはVcl.Forms.TFormから継承する場合依存性注入コンテナビルドのバリデーション

GlobalContainer.RegisterType<TApp>; 
GlobalContainer.RegisterType<TMyForm>; 
GlobalContainer.Build; 

、コンテナが構築されますが、アプリケーションがあるためTMyFormが全く登録されていない実際には動作しません。ビルドプロセスを検証する可能性があるかどうかを知りたい。特にリゾルバは、デフォルトのものではなく、私が考えるべきコンストラクタを解決しますか?

私はそのような何か試してみました:

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>; 

コンテナは、彼が使用することができます第一コンストラクタを使用して、このタイプを解決します。あなたが欲しいもの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>; 

今、コンテナが解決コンストラクタが作成しようとします(:TAppCos)をして、それは彼が意志失敗するなら「解決できない:TApp」のようなメッセージを表示します(前と同じように別のものを使用しないでください)。そしてこれが私が達成したかったものです。

編集: TAppユニットでの使用にSpring.Container.Commonを追加することを忘れないでください。