2016-10-31 5 views
1

Когда проект использует локатор обслуживания, классы реализации регистрируются в локаторе. А потом во время выполнения в определенных местах локатор просят разрешить определенную услугу, как это (многие из этих услуг являются одноэлементные):Место службы - проверить проект для реализации

LSvc := Locator.Resolve<ISomeService>; 

Плохо то, что это своего рода анти-паттерна. Но предполагая, что это происходит так, как есть, есть ли способ проверить, что есть единица, которая реализует ISomeService, регистрируя класс в локаторе, как это?

Locator.Register<ISomeService>(TSomeService); 
  1. Синтаксический исходные файлы;
  2. Имеются специальные единицы, называемые «* .Dependencies.pas», где перечислены все единицы реализации.

Что еще можно сделать в этом сценарии?

ответ

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. Имя содержит полное имя единицы в качестве префикса для типа.

Таким образом, даже без применения фильтра можно сохранить вывод этого файла в текстовый файл и после фильтрации ненужных (не требуемых интерфейсов) вы сможете найти интерфейсы, которые скомпилированы в проекте, но там это не классы, которые их реализуют.

Это именно тот случай, когда услуги повторно используются между проектами и запрашиваются через локатор обслуживания.