2011-10-13 20 views
31

मैं global.asax.cs पर निर्भरताओं को इंजेक्ट कैसे करूं, यानी एमवीसी अनुप्रयोग वर्ग?global.asax.cs पर निर्भरताओं को इंजेक्ट कैसे करें

पहले निर्भरता इंजेक्शन के लिए सेवा लोकेटर (एंटी-) पैटर्न का उपयोग करने के बाद, मैं एक आईओसी कंटेनर (विशेष रूप से Unity.Mvc3) का उपयोग कर अपने नवीनतम एमवीसी अनुप्रयोग में सर्वोत्तम अभ्यास सलाह का पालन करने की कोशिश कर रहा हूं क्योंकि यह कार्यान्वयन के साथ आता है बॉक्स पर बाहर निर्भरता रिसेल्वर) और कन्स्ट्रक्टर इंजेक्शन।

कुछ स्नैग को छोड़कर अब तक काफी सीधे आगे लगता है, जिनमें से एक global.asax.cs में है (दूसरा कस्टम विशेषताओं के लिए है लेकिन एसओ कवर पर एक सवाल है)।

जैसे MvcApplication कक्षा में HttpApplication ईवेंट हैंडलर्स:

Application_Start() 
Application_EndRequest(object sender, EventArgs e) 
Application_AcquireRequestState(object sender, EventArgs e) 

बाहरी निर्भरता, जैसे की आवश्यकता हो सकती एक ILogService पर निर्भरता। तो मैं सेवा लोकेटर (एंटी-) पैटर्न का उपयोग किए बिना उन्हें कैसे इंजेक्ट कर सकता हूं उदा।

private static ILogService LogService 
{ 
    get 
    { 
     return DependencyResolver.Current.GetService<ILogService>(); 
    } 
} 

किसी भी मदद/सलाह की बहुत सराहना की!

+0

हाय, दिलचस्प सवाल! OnApplicationStarted में आप अपने global.asax के भीतर निर्भरताओं को इंजेक्ट क्यों नहीं कर सकते? यदि आवेदन शुरू नहीं हो सकता है तो आप इसके बारे में अवगत होंगे क्योंकि कुछ भी काम नहीं करेगा ... –

उत्तर

31

आपके global.asax.cs में कक्षा आपके Composition Root है, इसलिए आप बाहर से कुछ भी इंजेक्ट नहीं कर सकते (और नहीं)।

हालांकि, वहाँ MvcApplication वर्ग के केवल एक उदाहरण है, ताकि आप अपने तरीकों में से एक में एक सेवा की जरूरत है, तो आप सिर्फ एक सदस्य क्षेत्र के रूप में यह घोषणा कर सकते हैं - उदाहरण के लिए:

public class MvcApplication : System.Web.HttpApplication 
{ 
    private readonly ILogService log; 

    public MvcApplication() 
    { 
     this.log = new MyLogService(); 
    } 

    protected void Application_Start() 
    { 
     // ... 

     this.log.Log("Application started"); 
    } 
} 
+5

संरचना रूट ब्लॉग पर +1। उत्तम सामग्री! –

+1

त्वरित उत्तर मार्क के लिए धन्यवाद। आप विधियों का परीक्षण कैसे करते हैं यद्यपि यदि आप उदाहरण के मॉक किए गए उदाहरण को इंजेक्ट नहीं कर सकते हैं ILogService? – magritte

+4

मैं नहीं करता हूं। एक रचना रूट एक विनम्र वस्तु का एक उदाहरण है (http://xunitpatterns.com/Humble%20Object.html)। यदि आपको जटिल तर्क का आह्वान करने की आवश्यकता है, तो आप एक और कक्षा में प्रतिनिधि हो सकते हैं जो * यूनिट परीक्षण किया जा सकता है। –

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