2013-03-21 8 views
7

मैंने देखा है कि सभी डी उदाहरणों के लिए, मैं हमेशा निर्भरताओं को अन्य वर्गों, सेवाओं की तरह देखते हैं। लेकिन एक वस्तु वास्तव में स्ट्रिंग्स और रिसोर्स रैपर (फाइल/पथ/यूआरआई/यूआरएल, कॉन्फ़िगरेशन वैल्यू स्ट्रिंग/दस्तावेज़, या रीडर के विपरीत) जैसे कॉन्फ़िगरेशन मानों पर, भारी और/या महत्वपूर्ण रूप से निर्भर हो सकती है।क्या मूल्य वस्तुएं डिज़ाइन पैटर्न के लिए मान्य निर्भरताएं हैं?

नोट, यह जावा या सी # सिंटैक्स में डी डिज़ाइन पैटर्न के बारे में है, यह नहीं कि कोई विशेष DI ढांचा कैसे संभालता है।

उदाहरण के लिए, मान लीजिए कि मेरे पास यह वर्ग है जो स्ट्रिंग (सापेक्ष पथ, कुछ अस्पष्ट कार्यान्वयन तर्क के आधार पर) देता है। यह (इसके विभिन्न कार्यान्वयनकर्ताओं) में "प्रोजेक्टलाक्शन" पर कॉन्फ़िगरेशन/प्रारंभिक निर्भरता है, क्योंकि उपयोगकर्ता के पास उनकी मशीन पर विभिन्न प्रोजेक्ट हो सकते हैं और यह कक्षा किसी दिए गए प्रोजेक्ट के आधार पर कुछ तर्क निष्पादित करेगी।

public abstract class PathResolver { 

    protected File projectFilesLocation; 

    public RoutinePathResolver(File projectFilesLocation) { 
     this.projectFilesLocation = projectFilesLocation; 
    } 

    public abstract String getPath(String someValue); 
} 

मैं डि उपयोग नहीं कर रहा सिर्फ यूनिट के परीक्षण के लिए (हांफी मैं भी नहीं इकाई परीक्षण, मौजूदा परियोजना हूँ)। मैं बस अपनी निर्भरता/रचनात्मक चिंताओं और तर्क चिंताओं की अवधि को अलग करना चाहता हूं।

+0

मेरे जैसे लोगों को जो पहली बार नहीं मिला, डी निर्भरता इंजेक्शन के लिए खड़ा है (अंग्रेजी मेरी प्राकृतिक भाषा नहीं है) :) – LaGrandMere

उत्तर

3

बशर्ते कि आप जिस चीज को इंजेक्ट करना चाहते हैं, उदाहरण के लिए, एक फ़ाइल स्थान, ऐसा कुछ है जो कक्षा द्वारा सीधे उपयोग किया जाएगा, तो यह इंजेक्ट करने के लिए पूरी तरह से मान्य है।

Object के मामले में File या String के मामले में यह सेवा नामक किसी चीज़ से अलग नहीं है। यह आपकी कक्षा के निर्भरता है, इस प्रकार डी लागू होता है।

+0

लेकिन दूसरी ओर, कोई कॉन्फ़िगरेशन सेटिंग इंटरफ़ेस इंजेक्ट कर सकता है, जो करता है लौटने की सेवा स्ट्रिंग मूल्य कहा? शायद एक रेपो, कॉन्फ़िगरेशन फ़ाइल, या कुछ और से। एक अंतर होगा। – Zombies

+0

आप ऐसा कर सकते हैं लेकिन IMHO कॉन्फ़िगरेशन सेटिंग्स इंटरफ़ेस एक ईश्वर वस्तु बनने के समाप्त होता है और आप इसके आधार पर सब कुछ खत्म कर देते हैं। प्रत्येक वर्ग के लिए आवश्यक विशिष्ट विन्यास को सीधे इंजेक्ट करना बेहतर होता है। हो सकता है कि अगर आप फ़ाइल लोड करने के विभिन्न तरीकों को चाहते हैं तो आपके पास 'CMSFileProvider' और' LocalSystemFileProvider 'कार्यान्वयन के साथ' FileProvider 'इंटरफ़ेस होगा। – James

+1

यह निर्भर करता है। कंक्रीट कॉन्फ़िगर वीओ होना बिल्कुल ठीक है। उदाहरण के लिए 'PathResolvedConfig'। अगर और केवल तभी जब यह विशेष रूप से उस विशिष्ट वर्ग (या इंटरफ़ेस, स्पष्ट रूप से) के लिए कॉन्फ़िगर डेटा लेता है। एक 'एप्लिकेशन कॉन्फिग' वीओ जिसमें से डेटा का केवल एक हिस्सा उपयोग किया जाता है निश्चित रूप से नो-नो है। – Creynders

संबंधित मुद्दे