यह वास्तव में एक बार करने के लिए सरल है जब आप समझते हैं कि DI पैटर्न और सिद्धांतों के बारे में है , न कि प्रौद्योगिकी।
एपीआई को डीआई कंटेनर-अज्ञेय तरीके से डिजाइन करने के लिए, इन सामान्य सिद्धांतों का पालन करें:
एक अंतरफलक के लिए कार्यक्रम, एक कार्यान्वयन नहीं
यह सिद्धांत वास्तव में डिजाइन पैटर्न से एक उद्धरण (स्मृति से हालांकि) है , लेकिन यह हमेशा आपका वास्तविक लक्ष्य होना चाहिए । DI केवल उस अंत को प्राप्त करने का एक साधन है ।
हॉलीवुड सिद्धांत लागू करें
DI के संदर्भ में हॉलीवुड सिद्धांत कहता है: DI कंटेनर को कॉल न करें, यह आपको कॉल करेगा ।
अपने कोड के भीतर से कंटेनर को कॉल करके सीधे निर्भरता के लिए कभी न पूछें। कन्स्ट्रक्टर इंजेक्शन का उपयोग करके इसके बारे में पूछें ।
कंस्ट्रक्टर इंजेक्शन का उपयोग करें
जब आपको एक निर्भरता की आवश्यकता होती है, तो इसे कंस्ट्रक्टर के माध्यम से सांख्यिकीय रूप से पूछें :
public class Service : IService
{
private readonly ISomeDependency dep;
public Service(ISomeDependency dep)
{
if (dep == null)
{
throw new ArgumentNullException("dep");
}
this.dep = dep;
}
public ISomeDependency Dependency
{
get { return this.dep; }
}
}
ध्यान दें कि सेवा वर्ग अपने आक्रमणकारियों की गारंटी कैसे देता है। एक बार एक उदाहरण तैयार हो जाने के बाद, गार्ड क्लॉज और के संयोजन के कारण निर्भरता उपलब्ध होने की गारंटी हैreadonly
कीवर्ड ।
यदि आपको एक अल्पकालिक वस्तु की आवश्यकता है तो एब्सट्रैक्ट फ़ैक्टरी का उपयोग करें
कंस्ट्रक्टर इंजेक्शन के साथ निर्भरताएं लंबे समय तक जीवित रहती हैं, लेकिन कभी-कभी आपको एक अल्पकालिक वस्तु की आवश्यकता होती है, या केवल रन-टाइम में ज्ञात मूल्य के आधार पर निर्भरता का निर्माण करने के लिए।
अधिक जानकारी के लिए इसे देखें ।
केवल अंतिम जिम्मेदार क्षण में लिखें
बहुत अंत तक वस्तुओं को सड़ने से बचाए रखें। आम तौर पर, आप आवेदन के प्रवेश बिंदु में सब कुछ इंतजार और तार कर सकते हैं। इसे कंपोजिशन रूट कहा जाता है ।
यहाँ अधिक जानकारी:
एक मुखौटा का उपयोग कर सरल करें
यदि आपको लगता है कि परिणामस्वरूप एपीआई नौसिखिए उपयोगकर्ताओं के लिए बहुत जटिल हो जाता है, तो आप हमेशा कुछ फ़ेसडे कक्षाएं प्रदान कर सकते हैं जो सामान्य निर्भरता संयोजनों को संलग्न करती हैं।
उच्च स्तर की खोज के साथ एक लचीला मुखौटा प्रदान करने के लिए, आप धाराप्रवाह बिल्डर्स प्रदान करने पर विचार कर सकते हैं। कुछ इस तरह:
public class MyFacade
{
private IMyDependency dep;
public MyFacade()
{
this.dep = new DefaultDependency();
}
public MyFacade WithDependency(IMyDependency dependency)
{
this.dep = dependency;
return this;
}
public Foo CreateFoo()
{
return new Foo(this.dep);
}
}
यह एक उपयोगकर्ता को लिखकर एक डिफ़ॉल्ट फू बनाने की अनुमति देगा
var foo = new MyFacade().CreateFoo();
हालांकि, यह बहुत खोज योग्य होगा कि कस्टम निर्भरता की आपूर्ति करना संभव है, और आप लिख सकते हैं
var foo = new MyFacade().WithDependency(new CustomDependency()).CreateFoo();
यदि आप कल्पना करते हैं कि MyFacade वर्ग अलग-अलग निर्भरता का एक बहुत कुछ करता है, तो मुझे आशा है कि यह स्पष्ट है कि यह कैसे विलक्षणता को खोज योग्य बनाते हुए उचित चूक प्रदान करेगा।
एफडब्ल्यूआईडब्ल्यू, इस उत्तर को लिखने के लंबे समय बाद, मैंने यहां की अवधारणाओं पर विस्तार किया और डीआई-फ्रेंडली लाइब्रेरी के बारे में लंबा ब्लॉग पोस्ट लिखा , और डीआई-फ्रेंडली फ्रेमवर्क के बारे में एक साथी पोस्ट ।