2012-01-31 4 views
6

सबसे पहले, मेरे पास एक dbcontext फैक्ट्री है जिसे public class DatabaseFactory : Disposable, IDatabaseFactory परिभाषित किया गया है और यह केवल एक संदर्भ बनाता है यदि कोई पहले से मौजूद नहीं है।एकाधिक भंडारों और निनजेक्ट का उपयोग करके काम की इकाई के लिए एक कारखाना उदाहरण इंजेक्ट कैसे करें?

अगला, मेरे पास एक सामान्य भंडार है जिसे public class Repository<T> : IRepository<T> where T : class परिभाषित किया गया है जो कारखाने को निर्माता में ले जाता है। मेरे पास अन्य ठोस भंडार हैं जो इस से प्राप्त होते हैं।

मेरे पास वर्क क्लास की एक इकाई भी है जिसे public class UnitOfWork : IUnitOfWork परिभाषित किया गया है जो कारखाने को कंस्ट्रक्टर में ले जाता है और कारखाने के अंदर संदर्भ में सभी परिवर्तनों को बचाता है (जो सभी भंडारों का उपयोग किया जाना चाहिए)।

मेरे नियंत्रक में, मेरे पास public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep) के रूप में निर्माता का सेट है।

असल में, मुझे कारखाने का एक ही उदाहरण काम की इकाई और सभी भंडारों में पारित करने की आवश्यकता है। निंजा के साथ, यह प्रत्येक ऑब्जेक्ट के लिए एक नया कारखाना बनाता है, ताकि वे सभी को एक उदाहरण दे सकें। क्या केवल एक उदाहरण को निंजा के माध्यम से पारित करने की अनुमति देने का कोई तरीका है या क्या मैं अपना कारखाना सही ढंग से नहीं बना रहा हूं और/या सही ढंग से निचोड़ नहीं समझ रहा हूं?

यहाँ Ninject में मेरे बाइंडिंग हैं:

kernel.Bind<IProjectRepository>().To<ProjectRepository>(); 
kernel.Bind<IIssueRepository>().To<IssueRepository>(); 
kernel.Bind<IUserRepository>().To<UserRepository>(); 
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 

उत्तर

10

यह इसलिए होता है क्योंकि डिफ़ॉल्ट रूप से NinjectTransient गुंजाइश का उपयोग करता है - जो एक नया उदाहरण हर बार एक प्रकार अनुरोध किया जाता है बनाता है।

और जानकारी:https://github.com/ninject/ninject/wiki/Object-Scopes

आप अपने आवेदन भर में एक प्रकार का एक विशेष उदाहरण के वास्तविक उपयोग के आधार पर गुंजाइश का होना चाहिए:

उदाहरण ऐसा दिखाई दे सकता:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope(); 
+0

वास्तव में? मैंने पिछले साढ़े सालों से उस जवाब की तलाश करने की कोशिश की। यह वहीं है जिसे मैं ढूंढ रहा था। मुझे नहीं पता कि Google के माध्यम से यह जवाब क्यों मुश्किल था। शायद मैं इसे जितना मुश्किल था उससे ज्यादा कठिन बनाने की कोशिश कर रहा था। एक बार फिर धन्यवाद! – snoluet

+0

यदि आपको मेरी पोस्ट उपयोगी मिलती है तो आप इसे उत्तर के रूप में स्वीकार कर सकते हैं :) – MonkeyCoder

+0

मैं करूंगा - आपने इसे बहुत जल्दी उत्तर दिया और अब मुझे 4 मिनट का इंतजार करना है :) धन्यवाद। यदि आपके पास दूसरा है, तो त्वरित प्रश्न यदि मैं कारखाना को सिंगलटन के रूप में रखता हूं - क्या यह एक एकल इंस्टेंस एप्लिकेशन को विस्तृत करेगा या केवल वर्तमान नियंत्रक के भीतर होगा? अगर मैं प्रोजेक्ट कंट्रोलर की तुलना में इश्यु कंट्रोलर के लिए कारखाने का एक अलग उदाहरण चाहता हूं (लेकिन उस विशिष्ट नियंत्रक के भीतर इसका एक उदाहरण), तो मेरे लिए इसका ख्याल रखेगा? – snoluet

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