अद्यतन: क्या विंडसर के अलावा आईओसी ढांचे में जो करने की कोशिश कर रहा हूं, उसे हासिल करने का कोई तरीका है? विंडसर नियंत्रकों को ठीक से संभालेगा लेकिन कुछ और हल नहीं करेगा। मुझे यकीन है कि यह मेरी गलती है लेकिन मैं ट्यूटोरियल वर्बेटिम का पालन कर रहा हूं और ऑब्जेक्ट्स सीटीओ इंजेक्शन के साथ हल नहीं कर रहे हैं, फिर भी वे रजिस्टरों को करने और हल करने के बावजूद शून्य हैं। मैंने तब से अपने डीआई कोड को तोड़ दिया है और अब मैन्युअल इंजेक्शन है क्योंकि परियोजना समय संवेदनशील है। डीआई को समय सीमा से पहले काम करने की उम्मीद है।एकाधिक कक्षाओं द्वारा कार्यान्वित इंटरफ़ेस के साथ निर्भरता इंजेक्शन
मैं एक समाधान कई वर्गों है कि सभी एक ही इंटरफ़ेस
एक साधारण उदाहरण के रूप को लागू किया है,
public class MyClassOne : IMyInterface {
public string GetString() {
....
}
public int GetInt() {
....
}
}
public class MyClassTwo : IMyInterface {
public string GetString() {
....
}
public int GetInt() {
....
}
}
अब Interface
public interface IMyInterface {
string GetString();
int GetInt();
...
}
ठोस वर्ग है इन वर्गों को इंजेक्शन दिया जाएगा जहां उनके ऊपर परतों की आवश्यकता होती है जैसे:
public class HomeController {
private readonly IMyInterface myInterface;
public HomeController() {}
public HomeController(IMyInterface _myInterface) {
myInterface = _myInterface
}
...
}
public class OtherController {
private readonly IMyInterface myInterface;
public OtherController() {}
public OtherController(IMyInterface _myInterface) {
myInterface = _myInterface
}
...
}
दोनों नियंत्रक एक ही इंटरफ़ेस से इंजेक्शन प्राप्त कर रहे हैं।
यह मेरी आईओसी में उचित ठोस वर्ग के साथ इन इंटरफेस को हल करने, मैं कैसे अंतर कि HomeController
MyClassOne
का एक उदाहरण की जरूरत है और OtherController
MyClassTwo
का एक उदाहरण की जरूरत है की बात आती है?
आईओसी में एक ही इंटरफेस में दो अलग कंक्रीट कक्षाओं को कैसे बांधूं? मैं 2 अलग-अलग इंटरफेस नहीं बनाना चाहता क्योंकि यह DRY नियम को तोड़ता है और वैसे भी समझ में नहीं आता है।
कैसल विंडसर में मैं 2 लाइनों इस तरह होगा:
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassOne>());
container.Register(Component.For<IMyInterface>().ImplementedBy<MyClassTwo>());
इसका कारण यह है कि मैं केवल कभी MyClassTwo
की एक प्रति है क्योंकि यह इंटरफेस के लिए पंजीकृत पिछले एक है मिल जाएगा काम नहीं करेगा।
जैसा कि मैंने कहा, मुझे नहीं लगता कि मैं प्रत्येक कंक्रीट के लिए विशिष्ट इंटरफेस बनाने के बिना इसे कैसे कर सकता हूं, यह न केवल डीआरवाई नियमों बल्कि बुनियादी ओओपी को तोड़ता है। मुझे यह कैसे हासिल होगा?
अद्यतन मार्क Polsen के जवाब
यहाँ मेरे वर्तमान आईओसी, जहां .Resolve
बयान जाना होगा है के आधार पर? मैं 'डॉन विंडसर डॉक्स
public class Dependency : IDependency {
private readonly WindsorContainer container = new WindsorContainer();
private IDependency() {
}
public IDependency AddWeb() {
...
container.Register(Component.For<IListItemRepository>().ImplementedBy<ProgramTypeRepository>().Named("ProgramTypeList"));
container.Register(Component.For<IListItemRepository>().ImplementedBy<IndexTypeRepository>().Named("IndexTypeList"));
return this;
}
public static IDependency Start() {
return new IDependency();
}
}
आप यदि आवश्यक हो तो ठोस वर्ग के लिए सीधे बाध्य कर सकते हैं। (ठीक है, कम से कम निनजेक्ट के साथ आप कर सकते हैं लेकिन मैं कल्पना नहीं कर सकता कि आप इसे अन्य डुबकी के साथ नहीं कर सकते हैं।) – Buildstarted
आप ऐसा नहीं करना चाहते हैं। आपकी कक्षाओं की निर्भरता संदिग्ध है। आप केवल कक्षाओं में से किसी एक को नहीं देख सकते हैं और बता सकते हैं कि इसे एक विशिष्ट कार्यान्वयन की आवश्यकता है। मैं अनुशंसा करता हूं कि आप एक कारखाने का उपयोग दोनों वर्गों में निर्भरता के रूप में करें। यहां और पढ़ें: http://www.codeproject.com/Articles/386164/Get-injected-into-the-world-of-inverted-dependenci – jgauffin
@jgauffin विंडसर की 'नामांकित (...)' विधि का वादा यह है कि यह उस अस्पष्टता को हल कर सकता है, लेकिन वास्तविक उपयोग में, मुझे कुछ भी हल करने के लिए विंडसर नहीं मिल सकता है :-( –