2012-01-23 16 views
19

कैसल विंडसर पंजीकरण की मेरी वर्तमान समझ यह है कि कोई केवल रूट घटक पर संकल्प को कॉल करके पंजीकरण को मान्य कर सकता है। लेकिन चूंकि विंडसर का घटक मॉडल प्रत्येक घटक की निर्भरताओं को जानता है, इसलिए यह जांचना संभव होना चाहिए कि सभी निर्भरता वास्तव में कुछ भी तत्काल किए बिना संतुष्ट हो सकती हैं। ऐसा करने का मुख्य कारण पंजीकरण के लिए एक इकाई परीक्षण होना है जिसके लिए मुझे उन घटकों को रोकने की आवश्यकता नहीं है जो स्टार्ट-अप पर बाहरी संसाधनों को कॉल करते हैं।कैसल विंडसर: क्या एक संकल्प कॉल के बिना पंजीकरण मान्य करने का कोई तरीका है?

उदाहरण के लिए। मैं एक वर्ग रूट IChild पर एक निर्भरता है कि है:

public class Root : IRoot 
{ 
    private IChild child; 

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

अगर मैं IRoot के रूप में रूट रजिस्टर, लेकिन एक IChild रजिस्टर नहीं है। जब मैं इस तरह संकल्प फोन:

MyNamespace.Root is waiting for the following dependencies: 

Services: 
- MyNamespace.IChild which was not registered. 

वहाँ की तरह कुछ है:

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

container.Resolve<IRoot>(); 

मैं कोई त्रुटि मिलती है

container.TestResolve<IRoot>(); 

कि निर्भरता ग्राफ चलना और जाँच करेगा कि सभी निर्भरता कर सकते हैं संतुष्ट हो, लेकिन जो वास्तव में कुछ भी तुरंत नहीं करता है?

उत्तर

27

ठीक है, यह संभव है। मुझे दिखाने के लिए Krzysztof Kommic के लिए धन्यवाद। तुरंत स्पष्ट नहीं है, लेकिन आप पंजीकरण के साथ संभावित समस्याओं को बढ़ाने के लिए विंडसर के नैदानिक ​​उपप्रणाली का उपयोग कर सकते हैं। मैं एक साथ रख दिया एक छोटे से स्थिर विधि फेंकता है कि अगर कोई गलत तरह से कॉन्फ़िगर घटक हैं:

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

आप इसे इस तरह उपयोग कर सकते हैं:

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

CheckForPotentiallyMisconfiguredComponents(container); 

इस मामले मैं इस संदेश के साथ एक MisconfiguredComponentException पाने में:

:

'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' सामान्य प्रकार या विधि 'Castle.Windsor में प्रकार पैरामीटर' TDiagnostic 'के रूप में इस्तेमाल नहीं किया जा सकता डाइग्नोस्टिक्स.आईडीआईग्नोस्टिक्सहोस्ट.गेटडिआग्नोस्टिक () '। वहाँ 'Castle.Windsor.Diagnostics.IDiagnostic ' को 'Castle.Windsor.Diagnostics.IPotentiallyMisconfiguredComponentsDiagnostic' से कोई अंतर्निहित संदर्भ रूपांतरण है। क्या आप इसे ठीक करने के बारे में जानते हैं? –

+0

पेरी, कोड .net 4 – samy

संबंधित मुद्दे