服务地点 - 检查项目实施情况

时间:2016-10-31 10:52:29

标签: delphi dependency-injection service-locator

当项目使用服务定位器时,实现类在定位器中注册。然后在某些地方的运行时,定位器被要求解决这样的某些服务(很多这些服务都是单身人士):

LSvc := Locator.Resolve<ISomeService>;

糟糕的是它是一种反模式。但假设这种情况发生了,有没有办法通过在这样的定位器中注册类来检查是否存在实现ISomeService的单元?

Locator.Register<ISomeService>(TSomeService);
  1. 解析源文件;
  2. 将名为“* .Dependencies.pas”的特殊单位列入所有实施单位。
  3. 在这种情况下还可以做些什么?

1 个答案:

答案 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过滤接口和类型。该名称包含完整的单位名称作为该类型的前缀。

因此,即使不应用过滤器,也可以将其输出保存到文本文件中,并在过滤掉不需要的(不是必需的接口)之后,您将能够找到在项目中编译的接口,但是没有实现它们的类。

当服务在项目之间重用并通过服务定位器请求时,情况确实如此。