2011-07-08 13 views
15

के लिए मौजूदा भंडार का लाभ उठाना मेरे पास एक एमवीसी 3 समाधान है जो एक भंडार पैटर्न का उपयोग करके निनजेक्ट के साथ कॉन्फ़िगर किया गया है। मेरी बाइंडिंग में शामिल हैं:कंसोल एप्लिकेशन के लिए निनजेक्ट को कॉन्फ़िगर करना और मेरे एमवीसी अनुप्रयोग

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope(); 
kernel.Bind<IMyService>().To<MyService>().InRequestScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

मैं अपने समाधान के लिए एक सांत्वना आवेदन जोड़ा गया है और मैं एक ही भंडार और सेवाओं का लाभ उठाने के लिए चाहते हैं।

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(new IoCMapper()); 

    var service = kernel.Get<IMyService>(); 
    var logger = kernel.Get<ILogging>(); 

    ... do some processing here 
} 

यह सिर्फ ठीक काम करता है, लेकिन मैं टी सही ढंग से एक सांत्वना आवेदन के लिए यह सुनिश्चित करें कि मैं Ninject को विन्यस्त कर रहा हूँ हो चाहता हूँ:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope(); 
kernel.Bind<IMyService>().To<MyService>().InSingletonScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

मेरे कंसोल कोड की तरह दिखता है: जैसे सांत्वना आवेदन के लिए मेरे Ninject विन्यास लग रहा है । क्या मेरे कंसोल एप्लिकेशन में मेरे सभी बाइंडिंग के लिए InSingletonScope() का उपयोग करना सही है? क्या मुझे इसे अलग-अलग कॉन्फ़िगर करना चाहिए?

उत्तर

11

क्या आप पूरे एप्लिकेशन के लिए अपनी प्रत्येक रिपोजिटरी सेवाओं में से एक और केवल एक उदाहरण चाहते हैं? यदि ऐसा है, तो InSingletonScope का उपयोग करें।

क्या आपका कंसोल एप्लिकेशन बहुप्रचारित है? यदि यह मामला है और आप प्रत्येक थ्रेड के लिए अपनी सेवाओं का एक नया उदाहरण चाहते हैं तो आप इनट्रेडस्स्कोप का उपयोग करेंगे।

यदि आप प्रत्येक बार सेवा के नए उदाहरण चाहते हैं, तो उन्हें इनट्रांसेंटस्कोप पर सेट करें।

आपके पास इनस्कोप का उपयोग करके अपना खुद का दायरा परिभाषित करने का विकल्प भी है। बॉब क्रेवेन्स इनमें से प्रत्येक का एक अच्छा अवलोकन देता है http://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

+0

कंसोल एप्लिकेशन में लूप के लिए एक सरल है जो कुछ यूआरएल के माध्यम से पुनरावृत्त करता है, सामग्री को स्क्रैप करता है, इसे संसाधित करता है और इसे डेटाबेस में सहेजने के लिए सेवाओं में भेज देता है। कोई async अनुरोध नहीं है तो मुझे लगता है कि यह इसे एकल धागा बना देगा? कौन सा दृष्टिकोण इस परिदृश्य को सबसे अच्छा फिट करता है? – Thomas

+0

यदि आप हर बार एक ही डेटाबेस कनेक्शन का उपयोग करना चाहते हैं तो आप इनसिंगलेटनस्कोप या इनरक्वैस्टस्कोप का उपयोग कर सकते हैं। एक तुल्यकालिक ऑपरेशन के लिए जो ठीक होना चाहिए। यदि किसी भी कारण से डेटाबेस सेवा के लिए आपके अनुरोध असीमित हो जाते हैं (जो यूओडब्ल्यू परिदृश्यों में आम है) तो आप एक ही समय में दो अलग-अलग कॉलों द्वारा उपयोग किए जा रहे डेटाबेस कनेक्शन के साथ समस्याओं में भागना शुरू कर सकते हैं। यह मेरे साथ कई महीने पहले हुआ था और –

+0

पर क्या चल रहा था, यह जानने के लिए मैं दिन बिताता हूं जब आप कहते हैं कि "डेटाबेस सेवा के लिए आपके अनुरोध अतुल्यकालिक हो जाते हैं" मुझे लगता है कि मुझे वास्तव में "कोड अतुल्यकालिक" बनने के लिए अपना कोड संशोधित करना है या है यह कुछ ऐसा है जो "हुड के नीचे" हो सकता है? – Thomas

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