Подниму вопрос во второй раз. Не вините меня, пожалуйста.
Ситуация:
у меня есть форма
TfrmMain = class(TForm)
private
[Inject('IniFileSettings')]
FSettings: ISettings;
public
end;
У меня есть процедура инициализации контейнера:
procedure BuildContainer(const container: TContainer);
begin
container.RegisterType<TIniSettings>.Implements<ISettings>('IniFileSettings');
container.RegisterType<TfrmMain, TfrmMain>.DelegateTo(
function: TfrmMain
begin
Application.CreateForm(TfrmMain, Result);
end);
container.Build;
end;
Поэтому я инициализирую как TfrmMain, так и TIniSettings через контейнер.
в .DPR у меня есть:
begin
BuildContainer(GlobalContainer);
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Также у меня есть помощник для TApplication:
procedure TApplicationHelper.CreateForm(InstanceClass: TComponentClass; var Reference);
var
locator: IServiceLocator;
begin
locator := TServiceLocatorAdapter.Create(GlobalContainer);
if locator.HasService(InstanceClass.ClassInfo) then
TObject(Reference) := GlobalContainer.Resolve(InstanceClass.ClassInfo).AsObject
else
inherited CreateForm(InstanceClass, Reference);
end;
Проблема: когда я пытаюсь
procedure TfrmMain.FormCreate(Sender: TObject);
begin
s := FSettings.ReadString('Connection', 'Server', 'localhost');
end;
Я получаю исключение AV, потому что FSettings в настоящее время равен NIL.
Как правильно получить объект FSettings из контейнера?
ОБНОВЛЕНИЕ:
FSettings := GlobalContainer.Resolve<ISettings>;
Эта строка работает отлично... Как и в прошлый раз, у меня проблема с использованием атрибута [Inject]. Даже с решением от Стефана я могу заставить метод работать:
Как инициализировать основную форму приложения в Spring4D GlobalContainer?