2017-09-18 3 views
1

Wenn ich Anwendung mit Dependency-Injektionscontainer (Spring4D) erstellen, würde ich gerne wissen, ob Container korrekt aufgebaut ist. In dieser Situation:Validierung der Abhängigkeitsinjektion Container Build

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

Wenn TMyForm von Vcl.Forms.TForm erbt dann Container aufgebaut, aber Anwendung wird in der Tat nicht, weil Arbeit TMyForm ist nicht registriert. Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Build-Prozess zu validieren. Vor allem löst Resolver den Konstruktor, den ich denke, sollte es nicht der Standardkonstruktor?

habe ich versucht, so etwas wie die:

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; 

Aber das ist bei weitem nicht ideal.

Antwort

1

Nach Nacht suchen und testen kann ich erreichen, was ich vorhatte. Wenn Sie gerade Art wie das Register:

GlobalContainer.RegisterType<TApp>; 

Behälter wird diese Art mit 1. contructor lösen, die er nutzen kann. Um zu erzwingen, Container exaclly diesen Konstruktor zu verwenden, was Sie wollen, müssen Sie diesen Konstruktor markieren [injizierte], wie folgt aus:

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

Jetzt Container wird resolve Konstruktor versuchen Create (a: TAppCos) und wenn es nicht, er wird zeige eine Nachricht wie: "Kann nicht auflösen: TApp". (Benutze keine andere wie zuvor). Und das wollte ich erreichen.

Bearbeitet: Vergessen Sie nicht, fügen Sie Spring.Container.Common zu Anwendungen in TApp Einheit.

Verwandte Themen