2012-01-23 15 views
19

Kale Windsor tescili hakkındaki şu andaki anlayışım, yalnızca bir kök bileşeninde Resolve'u arayarak kaydı doğrulayabilmesidir. Ancak, Windsor'un bileşen modeli her bileşenin bağımlılıklarını bildiğinden, tüm bağımlılıkların gerçekten bir şey ortaya çıkarmadan tatmin edilebildiğini test etmek mümkün olmalıdır. Bunu yapmak için ana neden, başlangıçta harici kaynakları çağıran bileşenleri saplamamı gerektirmeyen bir kayıt için bir birim testine sahip olmaktır. Örneğin,Castle Windsor: Çözümü bir çağrı olmadan tescil etmenin bir yolu var mı?

. Ben iKapak Mandalında Çocuk bağımlılık üzerinde bir kök sınıfı vardır:

public class Root : IRoot 
{ 
    private IChild child; 

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

Ben IRoot olarak Kök kayıt varsa, ancak bir iKapak Mandalında Çocuk kayıt yoktur. Böyle azmini aradığında: gibi bir şey

MyNamespace.Root is waiting for the following dependencies: 

Services: 
- MyNamespace.IChild which was not registered. 

var mı:

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

container.Resolve<IRoot>(); 

bir hata alıyorum bağımlılık grafiği yürümek ve kontrol ediyorum

container.TestResolve<IRoot>(); 

tüm bağımlılıkları olabilir ki tatmin olmak, ama aslında bir şey ortaya çıkarmıyor?

cevap

27

Tamam, Bu mümkündür. Bana nasıl olduğunu gösterdiği için Krzysztof Koźmic'e teşekkürler. Hemen açık değil, ancak tescil ile ilgili olası sorunları yükseltmek için Windsor'un teşhis alt sistemini kullanabilirsiniz.

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()); 
    } 
} 

Böyle kullanabilirsiniz:

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

CheckForPotentiallyMisconfiguredComponents(container); 

Bu mesaj içeren bir MisconfiguredComponentException olsun Bu durumda ben birlikte herhangi yanlış yapılandırılmış bileşenleri varsa atar biraz statik yöntem koyduk:

:
'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. 

tanı alt sistem hakkında daha fazla ayrıntı için kale belgelerine bakın tip 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic' jenerik türü veya yöntemin 'Castle.Windsor yazın parametresi 'TDiagnostic' olarak kullanılamaz:

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

+0

güzel test yöntemi :) – bevacqua

+1

bu kod artık derler .Diagnostics.IDiagnosticsHost.GetDiagnostic () '. 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic' ifadesinden 'Castle.Windsor.Diagnostics.IDiagnostic ' için hiçbir dolaylı başvuru dönüşümü yoktur. Bunu nasıl düzelteceğinizi biliyor musunuz? –

+0

Peri, kod benim için derler, Kale 3.2'nin altında .net 4 – samy

İlgili konular