ऊपर मेरा प्रश्न अभी भी मान्य है, लेकिन निम्न वैसे भी आपकी मदद कर सकता है।
फ़ंक स्वचालित कन्स्ट्रक्टर इंजेक्शन (ए.के.ए. ऑटो वायरिंग) का समर्थन नहीं करता है, और आपको इसे Func<T>
लैम्ब्डा अभिव्यक्तियों का निर्माण करके हाथ से करना होगा। चूंकि आप हाथ से कन्स्ट्रक्टर इंजेक्शन कर रहे हैं, इसलिए यह चुनना आसान है कि IDbConnectionFactory
क्या आप अपनी सेवाओं में इंजेक्ट करना चाहते हैं। उदाहरण:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
बेशक
आप भी नामित इस्तेमाल कर सकते हैं पंजीकरण, इस तरह:
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
ऑटो तारों के लिए समर्थन की कमी की वजह से
, तो आप इन बल्कि अजीब पंजीकरण के साथ खत्म होगा, और यह जल्द ही आपके रचनात्मक रूट के रखरखाव दुःस्वप्न में परिणाम देगा, लेकिन यह आपके प्रश्न से संबंधित नहीं है ;-)
आपको आमतौर पर अपने पंजीकरण में अस्पष्टता को रोकने की कोशिश करनी चाहिए। आपके मामले में आपके पास एक इंटरफ़ेस है, जो दो चीजें करता है (दो डेटाबेस से कनेक्ट होता है)।जब तक दोनों डेटाबेस में ठीक उसी मॉडल का हिस्सा, प्रत्येक डेटाबेस का अपना इंटरफ़ेस हकदार (यदि दो कार्यान्वयन विनिमेय नहीं हैं, आप Liskov substitution principle का उल्लंघन हो जाएगा):
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
जिस तरह से काम करता है के ServiceStack
, तो आप शायद जरूरत
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
अब आप के बजाय IDbConnectionFactory
का उपयोग करने का विशिष्ट इंटरफेस का उपयोग करने अपनी सेवाओं की परिभाषा बदलना चाहिए:
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
प्रत्येक के लिए एक कार्यान्वयन लागू करने के लिए
ध्यान दें कि यह कक्षा अब संपत्ति इंजेक्शन के बजाय कन्स्ट्रक्टर इंजेक्शन का उपयोग करती है। आप इसे संपत्ति इंजेक्शन के साथ काम करने के लिए प्राप्त कर सकते हैं, लेकिन आमतौर पर कन्स्ट्रक्टर इंजेक्शन के साथ जाना बेहतर होता है। इसके बारे में SO question यहां है। , MovieService
को
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
उन दो नए इंटरफेस और दो वर्गों और परिवर्तन आप एक बहुत जीत नहीं पाए क्योंकि Funq ऑटो का समर्थन नहीं करता:
Funq साथ
, आपके विन्यास तो इस तरह दिखेगा तारों। आप वह व्यक्ति होंगे जो मैन्युअल रूप से सबकुछ तारों से तार रखता है। हालांकि, जब आप एक फ्रेमवर्क पर स्विच करते हैं जो ऑटो-वायरिंग का समर्थन करता है, तो यह डिज़ाइन कंटेनर को बिना किसी समस्या के सही निर्भरताओं को इंजेक्ट करने की अनुमति देता है, क्योंकि इंजेक्ट करने के बारे में कोई चर्चा नहीं है।
क्या आप कुछ कोड दिखा सकते हैं? मुझे लगता है कि हम आपको अपने आवेदन के डिजाइन पर कुछ सुझाव दे सकते हैं, लेकिन इसके लिए, हमें वास्तविक डिजाइन की अधिक अंतर्दृष्टि की आवश्यकता है। यह देखना दिलचस्प होगा कि आप उन 'आईडीबीकनेक्शन फैक्ट्री' के इरादे से इंजेक्ट करते हैं, और उन सेवाओं को 'आईडीबीकनेक्शन फैक्ट्री' निर्भरताओं के साथ क्या करना है। – Steven
ध्यान दें कि फ़ंक एक बहुत ही सरल आईओसी कंटेनर है (कुछ लोग यह भी तर्क दे सकते हैं कि यह एक आईओसी कंटेनर नहीं है), और सबकुछ हाथ से तारित होना चाहिए। हालांकि, आप अपनी हर सेवा में जो कुछ भी चाहते हैं उसे इंजेक्ट कर सकते हैं। – Steven
मैंने प्रश्न को अद्यतन किया, इसे थोड़ा और स्पष्ट कर दिया और सरल इंजेक्टर पर आपका आलेख पाया। मैं आईओसी की समझ को गहरा बनाने की उम्मीद में अब पढ़ रहा हूं। –