फ़ील्ड इंजेक्शन मेरे स्वाद के लिए "दूरी पर एक डरावना क्रिया" भी है।
अपने Google समूह पोस्ट में आपके द्वारा दिए गए उदाहरण पर विचार करें:
public class VeracodeServiceImplTest {
@Tested(fullyInitialized=true)
VeracodeServiceImpl veracodeService;
@Tested(fullyInitialized=true, availableDuringSetup=true)
VeracodeRepositoryImpl veracodeRepository;
@Injectable private ResultsAPIWrapper resultsApiWrapper;
@Injectable private AdminAPIWrapper adminApiWrapper;
@Injectable private UploadAPIWrapper uploadApiWrapper;
@Injectable private MitigationAPIWrapper mitigationApiWrapper;
static { VeracodeRepositoryImpl.class.getName(); }
...
}
तो मूल रूप से आप जो कह रहे हैं, वह यह है कि "मेरे पास निजी राज्य के साथ यह वर्ग है, जिसमें मैंने @injectable
एनोटेशन संलग्न किया है , जिसका अर्थ है कि राज्य को बाहर से कुछ एजेंट द्वारा स्वचालित रूप से आबादी दी जा सकती है, भले ही मेरा राज्य सभी निजी घोषित किया गया हो । "
मैं इसके लिए प्रेरणाओं को समझता हूं। यह उस समारोह से बचने का एक प्रयास है जो एक वर्ग को ठीक से स्थापित करने में निहित है। मूल रूप से, जो एक कह रहा है कि "मैं इस बॉयलरप्लेट के सभी लेखन से थक गया हूं, इसलिए मैं बस अपने सभी राज्य को एनोटेट करने जा रहा हूं, और डीआई कंटेनर को मेरे लिए इसे स्थापित करने का ख्याल रखना चाहिए।"
यह पूरी तरह से मान्य बिंदु है। लेकिन यह भाषा सुविधाओं के लिए भी एक समाधान है कि यकीनन इसके आसपास काम नहीं किया जाना चाहिए। इसके अलावा, वहाँ क्यों रुकें? परंपरागत रूप से, DI ने एक साथी इंटरफ़ेस वाले प्रत्येक वर्ग पर भरोसा किया है। एनोटेशन के साथ उन सभी इंटरफेस को भी खत्म क्यों नहीं किया?
विकल्प पर विचार करें (यह C # होने जा रहा है, क्योंकि मैं इसे बेहतर जानता हूं, लेकिन जावा में संभवतः एक सटीक समकक्ष है):
public class VeracodeService
{
private readonly IResultsAPIWrapper _resultsApiWrapper;
private readonly IAdminAPIWrapper _adminApiWrapper;
private readonly IUploadAPIWrapper _uploadApiWrapper;
private readonly IMitigationAPIWrapper _mitigationApiWrapper;
// Constructor
public VeracodeService(IResultsAPIWrapper resultsApiWrapper, IAdminAPIWrapper adminApiWrapper, IUploadAPIWrapper uploadApiWrapper, IMitigationAPIWrapper mitigationApiWrapper)
{
_resultsAPIWrapper = resultsAPIWrapper;
_adminAPIWrapper = adminAPIWrapper;
_uploadAPIWrapper = uploadAPIWrapper;
_mitigationAPIWrapper = mitigationAPIWrapper;
}
}
पहले से ही मुझे इस वर्ग के बारे में कुछ बातें पता हैं। यह एक अपरिवर्तनीय वर्ग है; राज्य केवल निर्माणकर्ता (संदर्भ, इस विशेष मामले में) में निर्धारित किया जा सकता है। और क्योंकि सब कुछ एक इंटरफ़ेस से निकलता है, मैं कंस्ट्रक्टर में कार्यान्वयन को स्वैप कर सकता हूं, जो कि आपके मोक्स में आता है।
अब मेरे सभी DI कंटेनर को यह निर्धारित करने के लिए कंस्ट्रक्टर पर प्रतिबिंबित करना होगा कि उसे किन वस्तुओं को नया बनाने की आवश्यकता है। लेकिन उस प्रतिबिंब को एक सार्वजनिक सदस्य पर, प्रथम श्रेणी में किया जा रहा है ; यानी मेटाडेटा पहले से ही क्लास का हिस्सा है, जिसे कंस्ट्रक्टर में घोषित किया गया है, एक विधि जिसका उद्देश्य उद्देश्य वर्ग को निर्भरता के साथ प्रदान करना है।
दी यह एक बहुत बॉयलरप्लेट है, लेकिन इस तरह से भाषा डिजाइन की गई थी। एनोटेशन किसी चीज़ के लिए एक गंदे हैक की तरह लगता है जिसे भाषा में ही बनाया जाना चाहिए था।