2012-01-23 3 views
19

キャッスルウィンザー登録の現在の私の理解は、ルートコンポーネントの解決を呼び出すことによってのみ登録を検証できることです。しかし、Windsorのコンポーネントモデルは各コンポーネントの依存関係を知っているので、実際に何かをインスタンス化せずにすべての依存関係を満たすことができるかどうかをテストすることが可能でなければなりません。これを行う主な理由は、起動時に外部リソースを呼び出すコンポーネントをスタブする必要がない登録用の単体テストを持つことです。城ウィンザー:解決を呼びかけることなく登録を検証する方法はありますか?

たとえば、私はIRootとしてルートを登録しますが、IChildを登録しない場合は

public class Root : IRoot 
{ 
    private IChild child; 

    public Root(IChild child) 
    { 
     this.child = child; 
    } 
} 

:私はIChildに依存しているクラスのルートを持っています。私はこのような決意を呼び出すとき:

var container = new WindsorContainer().Register(
    Component.For<IRoot>().ImplementedBy<Root>() 
    ); 

container.Resolve<IRoot>(); 

私はエラーを取得する:依存関係グラフを歩くと、すべての依存関係ができていることを確認します

container.TestResolve<IRoot>(); 

MyNamespace.Root is waiting for the following dependencies: 

Services: 
- MyNamespace.IChild which was not registered. 

のようなものがあります満足していますが、実際には何もインスタンス化していませんか?

答えて

27

OK、可能です。 KrzysztofKoźmicに感謝してくれてありがとう。すぐには分かりませんが、ウィンザーの診断サブシステムを使用して登録の潜在的な問題を提起することができます。私はこのメッセージにMisconfiguredComponentExceptionを取得する。この場合

var container = new WindsorContainer().Register(
    Component.For<IRoot>().ImplementedBy<Root>() 
    ); 

CheckForPotentiallyMisconfiguredComponents(container); 

:あなたはこのようにそれを使用することができます

private static void CheckForPotentiallyMisconfiguredComponents(IWindsorContainer container) 
{ 
    var host = (IDiagnosticsHost)container.Kernel.GetSubSystem(SubSystemConstants.DiagnosticsKey); 
    var diagnostics = host.GetDiagnostic<IPotentiallyMisconfiguredComponentsDiagnostic>(); 

    var handlers = diagnostics.Inspect(); 

    if (handlers.Any()) 
    { 
     var message = new StringBuilder(); 
     var inspector = new DependencyInspector(message); 

     foreach (IExposeDependencyInfo handler in handlers) 
     { 
      handler.ObtainDependencyDetails(inspector); 
     } 

     throw new MisconfiguredComponentException(message.ToString()); 
    } 
} 

:私は一緒に任意の設定に誤りのコンポーネントがある場合はスロー少し静的メソッドを入れています:

'WindsorSpikes.Root' is waiting for the following dependencies: 
- Service 'WindsorSpikes.IChild' which was not registered. 

WindsorSpikes.MisconfiguredComponentException: 
'WindsorSpikes.Root' is waiting for the following dependencies: 
- Service 'WindsorSpikes.IChild' which was not registered. 

診断サブシステムの詳細については、城のマニュアルを参照してください:

http://stw.castleproject.org/Default.aspx?Page=Debugger-views&NS=Windsor

+0

素敵な試験方法:) – bevacqua

+1

このコードは、もはやコンパイルしません: 型「Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic」は型パラメータとして使用することはできません「TDiagnostic」ジェネリック型またはメソッド「Castle.Windsorに.Diagnostics.IDiagnosticsHost.GetDiagnostic () '。 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic'から 'Castle.Windsor.Diagnostics.IDiagnostic 'への暗黙的な参照変換はありません。 修正方法は知っていますか? –

+0

Peri、私のためにコードがコンパイルされました。城3.2下.net 4 – samy

関連する問題