我会在第二次提出这个问题。请不要怪我。
情况:
我有一个表格
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] 属性时遇到了问题。即使使用 Stefan 的解决方案,我也可以使该方法起作用: