2012-04-22 15 views
9

का उपयोग कर निर्भरता संपत्ति सुई मैं निम्नलिखित श्रेणियां होती हैं:कैसे Ioc एकता

public interface IServiceA 
{ 
    string MethodA1(); 
} 

public interface IServiceB 
{ 
    string MethodB1(); 
} 

public class ServiceA : IServiceA 
{ 
    public IServiceB serviceB; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

public class ServiceB : IServiceB 
{ 
    public string MethodB1() 
    { 
     return "MethodB1() "; 
    } 
} 

मैं आईओसी के लिए एकता का उपयोग करें, मेरी पंजीकरण इस तरह दिखता है:

container.RegisterType<IServiceA, ServiceA>(); 
container.RegisterType<IServiceB, ServiceB>(); 

जब मैं एक ServiceA उदाहरण को हल, serviceBnull होगा। मैं इसे कैसे हल कर सकता हूं? यहां कम से कम

उत्तर

14

आपके पास दो विकल्प:

आप/निर्माता इंजेक्शन का उपयोग करना चाहिए, उसके लिए आपको एक निर्माता की आवश्यकता कर सकते हैं:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

    public ServiceA(IServiceB serviceB) 
    { 
     this.serviceB = serviceB; 
    } 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

या एकता, संपत्ति इंजेक्शन का समर्थन करता है उसके लिए आपको एक संपत्ति की जरूरत है और DependencyAttribute:

public class ServiceA : IServiceA 
{ 
    [Dependency] 
    public IServiceB ServiceB { get; set; }; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

MSDN साइट What Does Unity Do? एकता के लिए एक अच्छा प्रारंभिक बिंदु है।

+6

यदि आपके पास कन्स्ट्रक्टर और प्रॉपर्टी इंजेक्शन के बीच कोई विकल्प है, तो मुझे लगता है कि आपको कन्स्ट्रक्टर इंजेक्शन चुनना चाहिए। संपत्ति इंजेक्शन कक्षा को एकता या कुछ अन्य कॉलर 'याद रखने' पर निर्भर करेगा कि उन्हें उस निर्भरता की आपूर्ति करने की आवश्यकता है। कन्स्ट्रक्टर इंजेक्शन कक्षा को उपयोग करने की कोशिश कर रहे किसी भी व्यक्ति को स्पष्ट करता है कि वर्ग के लिए निर्भरता आवश्यक है। – Carlos

+0

और यदि कक्षा में कई निर्भरताएं हैं, तो कुछ निश्चित कॉलों में इसकी आवश्यकता नहीं है? क्या वे सभी तत्काल होंगे? या जब वे ऊपर की तरह पहुंचे, तो उन्हें केवल तत्काल किया जाएगा: serviceB.method()? @ करलोस – Legends

+1

@ आपकी सभी निर्भरताओं को सूचीबद्ध किया जाएगा जब सर्विसए बनाया जाता है तब भी इंजेक्ट किया जाएगा जब आप उन्हें अपनी सभी विधि में उपयोग नहीं करते हैं। एकता बॉक्स के बाहर आलसी तत्कालता का समर्थन नहीं करती है लेकिन इसे एक्सटेंशन के रूप में जोड़ा जा सकता है: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv

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