当项目使用服务定位器时,实现类在定位器中注册。然后在某些地方的运行时,定位器被要求解决这样的某些服务(很多这些服务都是单身人士):
LSvc := Locator.Resolve<ISomeService>;
糟糕的是它是一种反模式。但假设这种情况发生了,有没有办法通过在这样的定位器中注册类来检查是否存在实现ISomeService的单元?
Locator.Register<ISomeService>(TSomeService);
在这种情况下还可以做些什么?
答案 0 :(得分:0)
有可能使用RTTI信息找到它。因此,下面的代码仅适用于最新版本的Delphi。
var
LIntf, LClass: TRttiType;
LImpl: TRttiInterfaceType;
LCtx: TRttiContext;
LFound: Boolean;
begin
LCtx := TRttiContext.Create;
for LIntf in LCtx.GetTypes do
if LIntf.TypeKind = tkInterface then
begin
LFound := False;
for LClass in LCtx.GetTypes do
begin
if LClass.TypeKind = tkClass then
for LImpl in TRttiInstanceType(LClass).GetImplementedInterfaces do
if LImpl.QualifiedName = LIntf.QualifiedName then
begin
LFound := True;
Break;
end;
if LFound then
Break;
end;
if not LFound then
Writeln(LIntf.QualifiedName, ' is not implemented by any class.');
end;
end;
您可以按QualifiedName过滤接口和类型。该名称包含完整的单位名称作为该类型的前缀。
因此,即使不应用过滤器,也可以将其输出保存到文本文件中,并在过滤掉不需要的(不是必需的接口)之后,您将能够找到在项目中编译的接口,但是没有实现它们的类。
当服务在项目之间重用并通过服务定位器请求时,情况确实如此。