2011-07-04 18 views
5

मैं कन्स्ट्रक्टर इंजेक्शन पैटर्न और नियम Don’t call the container; it’ll call you के आसपास थोड़ा उलझन में हूं।कन्स्ट्रक्टर इंजेक्शन - कहां कॉल करें?

क्या कोई मुझे समझा सकता है (और शायद कोई और) कैसे वास्तविक अनुप्रयोग को कन्स्ट्रक्टर इंजेक्शन का उपयोग करके सभी डी लाभ प्राप्त करना चाहिए? मैं के लिए है कि कुछ सरल देने के लिए और मुझे लगता है कि सामान्य उदाहरण:

DomainObject 
RepositoryObject 
DaoObject 

संबंधों स्पष्ट है (मुझे लगता है कि) - RepositoryObject जरूरत DaoObject, DomainObject जरूरत भंडार।

कन्स्ट्रक्टर इंजेक्शन का उपयोग करके मुझे लगता है कि मैं नए कीवर्ड के बारे में भूल सकता हूं (ज्यादातर मामलों में), लेकिन जब, मुझे नई वस्तुओं (मुख्य रूप से डोमेन) कहां और कैसे बनाना चाहिए? मुझे सभी वर्गों के लिए कारखानों को लिखना होगा? क्या मुझे उस कारखाने में डी कंटेनर का उल्लेख करना चाहिए?

सबसे अच्छा होगा जब कोई मुझे कुछ असली ऐप उदाहरण दिखाएगा (कृपया Asp.Net MVC :) :) या कुछ प्रोजेक्ट संरचना को स्केच करें।

+2

यह उत्तर देखें: http://stackoverflow.com/questions/6277771/what-is-a-composition-root-in-the-context-of- निर्भरता- इंजेक्शन/6277806#6277806 –

+0

@ मार्क - ठीक है, मुझे लगता है कि मुझे लगता है कि मुझे डोमेन ऑब्जेक्ट के निर्माण के साथ कुछ समस्याएं हैं। आइए मान लें कि मैंने नियंत्रक ऑब्जेक्ट (ग्लोबल.एक्सएक्स ऐप की जड़ के रूप में) बनाया है और अब मेरे पास कुछ एक्शन (पोस्ट) है, और इस बिंदु पर बनाना है, कहें - नई पुस्तक, और बुक को कुछ निर्भरता की आवश्यकता है (रिपोजिटरी या कुछ कुछ) । तो उस नई वस्तु को कैसे बनाया जाए? क्या मुझे हमेशा उस निर्भरता को नियंत्रक ऑब्जेक्ट प्रदान करना चाहिए, हालांकि उनमें से कुछ का उपयोग केवल "पुस्तक" ऑब्जेक्ट बनाने के लिए किया जाता है? वही स्थिति रिपोजिटरीज़ के साथ होती है (उनकी कुछ विधि नई डोमेन ऑब्जेक्ट्स बनाती हैं)। – mgibas

+1

http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve- निर्भरता-for-entities-business-object/4836790#4836790 –

उत्तर

1

मैं तो यहाँ अपनी कक्षा संबंध नहीं मिलता है एक और अधिक स्पष्ट ;-) उदाहरण है:

class FooService 
{ 
    IFooRepository FooRepository { get; set; } 

    public Service(IFooRepository fooRepository) 
    { 
     this.FooRepository = fooRepository; 
    } 
} 

class Controller 
{ 
    IFooService FooService { get; set; } 
    IBarService BarService { get; set; } 

    public Controller(IFooService fooService, IBarService barService) 
    { 
     this.FooService = fooService; 
     this.BarService = barService; 
    } 
} 

आप पहले से ही कहा है के रूप में - वहाँ कहीं भी नहीं है और न ही new FooRepository()new FooService() कोड है।

+0

आपको एक कंटेनर का उपयोग करने की आवश्यकता है एक एमवीसी एकीकरण है, यानी। http://code.google.com/p/autofac/wiki/Mvc3Integration –

+0

Thx, लेकिन मुझे पता है कि एमवीसी में नियंत्रक बनाने के लिए इसका उपयोग कैसे करें, लेकिन बाकी वस्तुओं (डोमेन मुख्य रूप से) के साथ क्या है? – mgibas

+0

डोमेन ऑब्जेक्ट (नेस्टेड ऑब्जेक्ट्स) आपके कॉन्फ़िगरेशन के आधार पर DI कंटेनर द्वारा स्वचालित रूप से बनाया जाएगा। आपको अपने डी कंटेनर को कॉन्फ़िगर करना होगा (या तो कोड या कुछ कॉन्फ़िगरेशन फ़ाइलों के माध्यम से) यह बताकर कि कौन सा वर्ग प्रत्येक कन्स्ट्रक्टर तर्क के लिए तत्काल है। मेरे उदाहरण में आप डी 'कंटेनर को' FooService 'को तत्काल करने के लिए बताएंगे जब भी यह' IFooService' प्रकार का तर्क देखता है, इसलिए जब यह नियंत्रक बनाता है तो यह जानता है कि तर्क के रूप में क्या पास करना है। –

1

उत्तर और मार्क सीमैन का लिंक पर्याप्त है लेकिन मैं कुछ जोड़ना चाहता हूं। डीआई (जो मैं हूं) के लिए एक शुरुआत के रूप में यह सवाल हमेशा मुझे बग करता है: "ठीक है, कोई नया नहीं है, लेकिन कब और कैसे मेरी वास्तविक वस्तुओं को बुलाया जाता है?"। मुझे समझने और लागू करने के लिए मुझे थोड़ी देर लग गई।

जैसे ही आप उत्तर और लिंक का पालन करते हैं, आप उसे देखेंगे। आपको अपने अनुप्रयोगों में अपने इंटरफेस और कक्षाओं को वेब एप्लिकेशन के लिए ग्लोबल.एक्सएक्स फ़ाइल पंजीकृत करनी चाहिए। उदाहरण के लिए यदि आप निनजेक्ट का उपयोग कर रहे हैं और निजेट.एब (जो वेबफॉर्म के लिए है) डाउनलोड करें और इसे इस उदाहरण में http://azolotar.blog.com/2010/06/22/ninject-2-0-in-webforms/

उदाहरण में मुख्य बिंदु लागू करें।

  • Global.asax NinjectHttpApplication (जो Ninject.Web.dll में है)
  • CreateKernel विधि ओवरराइड की गई है यह वह जगह है जहाँ आप कर्नेल बना सकते हैं और
  • BasePage कंटेनर के लिए अपने निर्भरता नक्शा बता से विरासत में मिली है: इस वेबफॉर्म के लिए है इसलिए पृष्ठों में आपका इंटरफ़ेस हल हो जाएगा यदि वे सभी बेसपृष्ठ से व्युत्पन्न हैं।

मैं इस जोड़ना चाहिए, BasePage कार्यान्वयन बहुत आसान है (यहाँ github पर कोड है) तो आप शायद पहले से ही एक basepage तो इस लाइन KernelContainer.Inject (यह) जोड़ने है; आपके बेस पेज के ऑनइनिट में समस्या हल हो सकती है। एक आखिरी शेष, यदि आप एएक्सएक्स में कुछ भी इस्तेमाल करने जा रहे हैं तो आपको अपने एसीएक्स के ऑनइनिट को ओवरराइड करना चाहिए ताकि कंटेनर निर्भरताओं को हल कर सके।

मैं जानता हूँ कि आप ने कहा कोई MVC या वेब?) लेकिन तर्क एक ही

  • आवेदन की शुरुआत (मुख्य पर अपने depenceny नक्शा सेट है खिड़कियों के लिए)
  • अपनी नहीं वेब कोई यूआरएल नहीं के बाद से इस उदाहरण में सीधे कॉलिंग फॉर्म How to use Ninject in a Windows Forms application? कहेंगे।पता नहीं है कि आप कुछ पैटर एमवीपी या एमवीवीएम का उपयोग कर रहे हैं, लेकिन यह एक शुरुआती बिंदु

अरे यह उपयोगी उत्तर नहीं देता है लेकिन वैसे भी, उम्मीद है कि इससे मदद मिलती है।

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