सोलिड सिद्धांतों के अनुसार एक वर्ग अन्य वर्गों पर निर्भर नहीं हो सकता है, निर्भरताओं को इंजेक्शन देना होगा। यह सरल है:निर्भरता उलटा। ऑब्जेक्ट सृजन
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
लेकिन क्या होगा अगर मैं चाहता हूँ बार के बनाने के लिए, Ibar पीछे सटीक कार्यान्वयन नहीं जानने में सक्षम होने की मेरी फू वर्ग? मैं 4 समाधान यहाँ के बारे में सोच सकते हैं, लेकिन उन सभी को कमियां है लगता है:
- वस्तु के प्रकार के इंजेक्शन लगाने और का उपयोग कर प्रतिबिंब
- जेनेरिक्स का उपयोग कर
- "सेवा लोकेटर" का उपयोग करने और हल बुला () तरीका।
- एक अलग कारखाने वर्ग बनाने और फू में यह इंजेक्शन लगाने:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
अंतिम मामले प्राकृतिक लगता है, लेकिन BarCreator वर्ग भी से थोड़ा कोड है। तो आप कैसे सोचते हैं, जो सबसे अच्छा है?
विकल्प 4 सही उत्तर है: http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 –
हालांकि, आप फू को इबार क्यों बनाना चाहते हैं? लीकी एब्स्ट्रैक्शन के प्रति सावधान रहें। –