2014-06-18 1 views
2

так, например, у меня есть основная форма и вы хотите ввести экземпляр регистратора в качестве частного поля.Как инициализировать основную форму заявки в Spring4D GlobalContainer?

зарегистрироваться РЕГИСТРАТОРУ

GlobalContainer.RegisterType<TCNHInMemoryLogger>.Implements<ILogger>; 

У меня есть частное поле в моей основной форме

private 
    FLogger: ILogger; 

Все, что я хочу сделать так:

private 
    [Inject] 
    FLogger: ILogger; 

В моей DPR файл У меня типичный способ delphi для создания основной формы:

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(Tfrm_CNH, frm_CNH); 
    Application.Run; 
end. 

Что я должен изменить способом создания формы, чтобы правильно ввести частные поля?

Кстати, если я разрешаю поле в Form.OnCreate с GlobalContainer.Resolve, он отлично работает. Но я хочу избежать использования переменной GlobalContainer в своих формах.

ответ

5

Вы также должны зарегистрировать свою форму в контейнере. Это делается так:

procedure BuildContainer(const container: TContainer); 
begin 
    container.RegisterType<ILogger, TCNHInMemoryLogger>; 
    container.RegisterType<TForm8, TForm8>.DelegateTo(
    function: TForm8 
    begin 
     Application.CreateForm(TForm8, Result); 
    end); 
    container.Build; 
end; 

в главном вы тогда пишете:

begin 
    BuildContainer(GlobalContainer); 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    frm_CNH := GlobalContainer.Resolve<Tfrm_CNH>; 
    Application.Run; 
end. 

Вы могли даже написать помощника для TApplication, так что вы можете держать вызов Application.CreateForm и не позволяйте Время от времени IDE испортит ваш основной ресурс.

type 
    TApplicationHelper = class helper for TApplication 
    procedure CreateForm(InstanceClass: TComponentClass; var Reference); 
    end; 

procedure TApplicationHelper.CreateForm(InstanceClass: TComponentClass; 
    var Reference); 
begin 
    if GlobalContainer.HasService(InstanceClass.ClassInfo) then 
    TObject(Reference) := GlobalContainer.Resolve(InstanceClass.ClassInfo).AsObject 
    else 
    inherited CreateForm(InstanceClass, Reference); 
end; 

Вы тогда, конечно, нужно, чтобы убедиться, что ваш режим BuildContainer не использовать этот помощник (поместить в отдельный блок регистрации), или вы в конечном итоге в рекурсии.

 Смежные вопросы

  • Нет связанных вопросов^_^