मैं अब थोड़ी देर में विंडसर कैसल का उपयोग करता हूं। यह उन वातावरणों के लिए बिल्कुल सही है जहां डेटा डेटाबेस या जैसे में स्थित है, जहां रिपोजिटरी पैटर्न या यूनिटोफवर्क पैटर्न अच्छी तरह से काम करता है।विंडसर कैसल/डीआई और ऑब्जेक्ट मॉडल
अब मेरे पास एक अलग स्थिति है: मेरे पास एक जटिल ऑब्जेक्ट मॉडल है जो कई एकल पीओएनओ द्वारा इकट्ठा किया जाता है। पर्यावरण को अधिक स्पष्ट बनाने के लिए COM द्वारा दृढ़ता से प्रभावित किया जाता है: एक्सेल, वर्ड पीआईओ का भारी उपयोग किया जाता है।
मैं कमांड पैटर्न का उपयोग करता हूं, मैंने आईसीओएमएंड हैंडलर को here वर्णित किया लेकिन एक अंतर के साथ लागू किया। जैसा कि मैं कमांड कमांड पैटर्न के बगल में कुछ भी जानने के बिना रन में कॉल करने के लिए आदेशों की सूची में असेंबली कमांड करना चाहता हूं, यह निष्पादन विधि को कॉल करते समय संदर्भ को प्रस्तुत नहीं करता है। तो इंटरफ़ेस इस तरह दिखता है:
public interface ICommand
{
void Execute();
bool CanExecute();
}
उस इंटरफ़ेस के साथ कमांड का निष्पादन प्रभावी और समझने में आसान है। दूसरी ओर यह सीटीओआर के साथ संदर्भ पेश करने में एक समस्या है क्योंकि इसलिए कंटेनर को स्पष्ट रूप से उदाहरण के लिए बुलाया जाना चाहिए। सीटीआर पैरामीटर जोड़ें।
इसलिए मैं वास्तव में दो प्रश्न हैं:
- इसकी सुई एक संभव है - कंटेनर explictely बुला बिना विंडसर कैसल द्वारा स्वचालित रूप से - चलो यह एक संदर्भ, ऑब्जेक्ट मॉडल का एक हिस्सा कहते हैं?
- DI का उपयोग कर कमांड पैटर्न से कैसे भाग लें? here वर्णित आरआरआर नियम का पालन करके कार्यों/कार्यों की सूची को परिभाषित करने में सक्षम होने के बारे में कोई विचार कैसे पूरा किया जा सकता है?
आप कमांड/हैंडलर पैटर्न का एक विवरण ('ICommandHandler' का प्रयोग करके) से लिंक, लेकिन वास्तव में आप कमान पैटर्न है, जो पूरी तरह से अलग है, क्योंकि आदेश/हैंडलर पैटर्न में आदेशों व्यवहार के बिना DTOs हैं प्रयोग कर रहे हैं, और उनमें कोई 'निष्पादन विधि' नहीं है। उन पर 'निष्पादन' विधि होने से कमांड/हैंडलर पैटर्न लाए जाने वाले अधिकांश क्षमताओं को अक्षम करता है। जब आप हैंडलरों में निर्भरता इंजेक्ट करते हैं तो आदेशों में इंजेक्शन निर्भरताओं के साथ समस्याएं समाप्त हो जाएंगी। कमांड/हैंडलर पैटर्न में, कमांड की कोई निर्भरता नहीं होती है (क्योंकि उनके पास कोई व्यवहार नहीं है)। –
Steven
उत्तर के लिए धन्यवाद, स्टीवन। आप निश्चित रूप से सही हैं, मैं उन्हें हैंडलर में इंजेक्ट कर सकता हूं। लेकिन इससे समस्या हल नहीं होती है, क्योंकि मुझे अभी भी एक ही जानकारी इंजेक्ट करना है और हैंडलर को अपना डेटा उपलब्ध कराने के लिए कंटेनर को कॉल करना है। आदेशों को बैच करना और उन्हें एक पंक्ति में निष्पादित करना संभव नहीं होगा। क्या मुझे कुछ गलत मिला? –