Spring4D 解析带构造Owner参数的TFrame及工厂实现问题
步骤1:调整工厂接口,增加页面名称参数
你原来的工厂接口只接收Owner参数,没有传入要获取的Frame的注册名称,所以无法定位到指定实现,首先修改接口定义:
IPageFactory = interface(IInvokable) ['{2E40E3C4-87B7-4313-BE0A-29202B7EB5A1}'] // 新增aPageName参数,传入你注册Frame时用的命名标识 function Create(aOwner: TComponent; const aPageName: string): TfraBasePage; end;
步骤2:调整Frame注册逻辑,显式指定构造函数注入规则
你需要告诉容器,Frame要使用带Owner参数的构造函数创建,构造参数由工厂传入,不需要容器自行解析:
// 注册每个Frame时都显式指定使用带TComponent参数的构造函数 GlobalContainer.RegisterType<TfraBasePage, TfraSetting>(IDSettingPage) .InjectConstructor([TypeInfo(TComponent)]); GlobalContainer.RegisterType<TfraBasePage, TfraCurrency>(IDCurrencyPage) .InjectConstructor([TypeInfo(TComponent)]); GlobalContainer.RegisterType<TfraBasePage, TfraTicketLayOut>(IDTicketLayOutPage) .InjectConstructor([TypeInfo(TComponent)]); GlobalContainer.RegisterType<TfraBasePage, TfraSetUp>(IDSetUpPage) .InjectConstructor([TypeInfo(TComponent)]); // 注册工厂,不需要加命名标识,全局只需要一个IPageFactory实例即可 GlobalContainer.RegisterFactory<IPageFactory>;
步骤3:调用工厂获取对应Frame
注册完成后,先解析出工厂实例,再调用Create方法传入Owner和对应Frame的注册名即可:
var oFrame: TfraBasePage; begin // 先解析工厂实例,不需要加名称参数 oFrame := GlobalContainer.Resolve<IPageFactory>.Create(Self, IDSettingPage); // 此时获取到的oFrame的构造Owner已经是当前类实例,无需再手动调用InsertComponent end;
原写法错误原因
你之前将页面名称放在Resolve<IPageFactory>('SettingPage')的参数中,是让容器查找名称为SettingPage的IPageFactory实现,而你从未注册过命名的工厂,所以会报错。
内容的提问来源于stack exchange,提问作者Ravaut123
相关产品推荐
相关产品推荐

