2016-10-31 3 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でインターフェイスとタイプをフィルタリングできます。名前には、型の接頭辞としての完全な単位名が含まれます。

フィルタを適用しなくても、これをテキストファイルに保存して不要な(不要なインターフェイスは除外した)フィルタを適用した後、プロジェクトでコンパイルされたインターフェイスを見つけることができます。それらを実装するクラスはありません。

これは、サービスがプロジェクト間で再利用され、サービスロケータを介して要求された場合です。

関連する問題