2009-05-12 16 views
5

कुछ निर्भरता इंजेक्शन कंटेनर आपको पहले से निर्मित ऑब्जेक्ट में कॉन्फ़िगर की गई सेवाओं को इंजेक्ट करने में सक्षम बनाता है।विंडसर महल निर्मित वस्तु के गुण इंजेक्शन

क्या यह विंडसर का उपयोग करके हासिल किया जा सकता है, जबकि किसी भी सेवा निर्भरता का खाता लेना लक्ष्य वस्तु पर हो सकता है?

+2

डुप्लिकेट::

public static void InjectDependencies(this object obj, IWindsorContainer container) { var type = obj.GetType(); var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var property in properties) { if (property.PropertyType.IsInterface) { var propertyValue = property.GetValue(obj, null); if (propertyValue == null) { var resolvedDependency = container.Resolve(property.PropertyType); property.SetValue(obj, resolvedDependency, null); } } } } 

यहाँ इस विधि के लिए एक सरल इकाई परीक्षण है: http://stackoverflow.com/questions आप किसी विशेष विशेषता आदि देखने के लिए आगे के पाठ्यक्रम अवधारणा का विस्तार कर सकता है/4471 9 3 –

+0

यह उस प्रश्न का डुप्लिकेट नहीं है। सवाल यह पूछता है कि क्या विंडसर उन वस्तुओं को हल कर सकता है जो पंजीकृत नहीं हैं। – PhilHoy

उत्तर

5

नहीं, यह नहीं हो सकता है।

1

जैसा कि क्रिज़िट्टोफ ने कहा था, इसके लिए कोई आधिकारिक समाधान नहीं है। हालांकि आप this workaround आजमा सकते हैं।

व्यक्तिगत रूप से, मुझे यह कोड गंध करने पर विचार करना है। यदि यह आपका कोड है, तो यह कंटेनर में पंजीकृत क्यों नहीं है? यदि यह आपका कोड नहीं है, तो इसके लिए एक कारखाना/एडाप्टर/आदि लिखें।

+0

मैं सहमत हूं - यह एक गंध है। आप इसे पहली जगह क्यों करना चाहते हैं? यह सादा गलत है। –

+0

मेरे पास एक बहुत ही साधारण मामला है जहां मुझे यह करने की ज़रूरत है: – Steve

+0

मैं कंटेनर के माध्यम से एक उदाहरण बना देता हूं, फिर किसी बिंदु पर मैं अपना उदाहरण क्रमबद्ध करता हूं। हालांकि मैं निर्भरताओं को क्रमबद्ध नहीं करना चाहता हूं। जब मैं deserialize मैं निर्भरता वापस वस्तु में जोड़ने की जरूरत है। कैसल विंडसर का उपयोग करके मैं इस समस्या को कैसे हल करूं? – Steve

9

यह एक पुरानी सवाल है, लेकिन गूगल मुझे यहाँ नेतृत्व हाल ही में ऐसा ही सोचा था कि मैं अपने समाधान ऐसा न हो कि वह किसी व्यक्ति को विंडसर के लिए StructureMap के निर्माण विधि की तरह कुछ की तलाश में मदद का हिस्सा होगा।

मुझे पता चला कि मैं इस कार्यक्षमता को अपेक्षाकृत आसानी से जोड़ सकता हूं। यहां एक उदाहरण दिया गया है जो किसी ऑब्जेक्ट में निर्भरता को इंजेक्ट करता है जहां इसे एक शून्य इंटरफ़ेस-टाइप की गई संपत्ति मिलती है।

[TestFixture] 
public class WindsorContainerExtensionsTests 
{ 
    [Test] 
    public void InjectDependencies_ShouldPopulateInterfacePropertyOnObject_GivenTheInterfaceIsRegisteredWithTheContainer() 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<IService>().ImplementedBy<ServiceImpl>()); 

     var objectWithDependencies = new SimpleClass(); 
     objectWithDependencies.InjectDependencies(container); 

     Assert.That(objectWithDependencies.Dependency, Is.InstanceOf<ServiceImpl>()); 
    } 

    public class SimpleClass 
    { 
     public IService Dependency { get; protected set; } 
    } 

    public interface IService 
    { 
    } 

    public class ServiceImpl : IService 
    { 
    } 
} 
+2

वैसे, मुझे एमवीसी.NET के लिए एक्शनफिल्टर में इंजेक्शन निर्भरताओं में इंजेक्शन की आवश्यकता है। –

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