【发布时间】:2020-09-14 13:33:29
【问题描述】:
正如我以前在 Java 中所做的那样,我尝试在 Delphi 中做一个 ServiceLocator。一些代码存在,但它没有像预期的那样工作。
我不想要带有枚举或其他任何内容的案例,我想要一个在创建新类时不必接触的代码。
我的应用程序和所有其他应用程序都有一个全局接口:
type
IMyApp = interface
end;
IBuilder = interface(IMyApp)
procedure Build;
end;
IPrint = interface(IMyApp)
procedure Print;
end;
ICalculator = interface(IMyApp)
procedure Calc;
end;
我想要一个这样的类,我直接通过接口创建实现,并且对象是通过 find 它创建的(也许使用 RTTI ?):
class function TServiceLocator.Get(aInterface: IMyApp): IMyApp;
var
C : TRttiContext;
T : TRttiInstanceType;
V : TValue;
ClassNameToCreate: string;
begin
// Ex: TBuilder (Replace I by T)
ClassNameToCreate := 'T' + Copy(aInterface.GetName, 1, aInterface.GetName.Length);
T := (C.FindType(ClassNameToCreate) as TRttiInstanceType);
Result := V as IMyApp;
end;
var
b: IBuilder;
begin
b := TServiceLocator.Get(IBuilder);
b.Build;
end.
【问题讨论】:
-
看看 Spring4D 框架。 AFIK,它已经包含了您想要创建的内容!
-
谢谢,我已经用过Spring4D了,不过那是公司项目用不了