फिलहाल मैं एकता के साथ निर्भरता इंजेक्शन कंटेनर के साथ थोड़ा सा प्रयोग कर रहा हूं।निर्भरता इंजेक्शन और अन्य कन्स्ट्रक्टर पैरामीटर - खराब अभ्यास?
को देखते हुए निम्नलिखित इंटरफ़ेस:
public interface IPodcastCommService
{
void Download();
void Upload();
}
और निम्नलिखित कार्यान्वयन:
public class PodcastService
{
private IPodcastCommService commservice;
private String url;
public PodcastService(String url, IPodcastCommService commservice)
{
this.commservice = commservice;
this.url = url;
}
}
निर्माता की वजह से
, मैं यह करने के लिए पैरामीटर पारित करने के लिए एक समाधान के लिए देख रहा था और पाया यह:
var p = container.Resolve<IPodcastCommService>(new ParameterOverride("url", myUrl));
अब तक इतना अच्छा है, लेकिन साथ ही मैंने पढ़ा है कि यह कितना बुरा है और कैसे कक्षा का डिज़ाइन खराब है और हां, यह थोड़ा बदसूरत दिखता है। लेकिन मैं एक सुरुचिपूर्ण तरीके से कक्षा में पैरामीटर कैसे पारित कर सकता हूं?
मेरा पहला विचार यह संपत्ति के रूप में करना था, लेकिन फिर मुझे हर बार जांच करना होगा कि मुझे पहले से ही यूआरएल की आवश्यकता है।
अद्यतन:
लेकिन वहाँ मामलों आप संकल्प ऑपरेशन के लिए कस्टम निर्माता मानकों में पारित किया है जहां हो सकता है: एक उदाहरण है, मैं जहां पढ़ा है कि यह बुरा डिजाइन है, यह है। कुछ लोग तर्क दे सकते हैं कि यह खराब वास्तुकला की चिल्लाती है लेकिन ऐसी स्थितियां हैं जैसे डीआई कंटेनर को विरासत प्रणाली में लाने के लिए जो इस तरह के कार्यों की आवश्यकता हो सकती है।
स्रोत: http://mikaelkoskinen.net/unity-passing-constructor-parameters-to-resolve/
क्या आप मुझे यह बताना चाहते हैं कि आपके पास लाल रंग है जहां यह खराब डिजाइन है? क्योंकि मैं वास्तव में सोचता हूं कि यह डिज़ाइन सबसे अच्छा है जिसे आप कभी भी प्राप्त करेंगे। – Egi
@Egi: मैंने एक स्रोत के साथ अपना प्रश्न अपडेट किया। – Kai
आप कन्स्ट्रक्टर में इंजेक्शन गुणों को सूचीबद्ध किए बिना DI को करने के लिए [ServiceLocator] (https://commonservicelocator.codeplex.com/) का उपयोग कर सकते हैं। – orad