मैं एक यूआई के साथ एक विनफॉर्म एप्लिकेशन बना रहा हूं जिसमें केवल NotifyIcon
और इसकी गतिशील रूप से आबादी ContextMenuStrip
शामिल है। एप्लिकेशन को एक साथ रखने के लिए MainForm
है, लेकिन यह कभी दिखाई नहीं दे रहा है।आईओसी: इवेंट हैंडलर पर निर्भरता को तारों
मैंने इसे यथासंभव ठोस बनाने के लिए सेट किया है (ऑब्जेक्ट ग्राफ़ को संभालने के लिए ऑटोफैक का उपयोग करके) और मेरी सफलता से काफी प्रसन्न हूं, ज्यादातर ओ भाग के साथ भी अच्छी तरह से साथ मिल रहा है। विस्तार के साथ मैं वर्तमान में इसे कार्यान्वित कर रहा हूं ऐसा लगता है कि मैंने अपने डिजाइन में एक दोष खोजा है और थोड़ा सा पुनर्निर्माण करने की आवश्यकता है; मुझे लगता है कि जिस तरह से मुझे जाना है, मुझे पता है कि निर्भरता को सही तरीके से परिभाषित करने के तरीके के बारे में थोड़ा अस्पष्ट है।
ऊपर वर्णित अनुसार, मेनू शुरू करने के बाद गतिशील रूप से आबादी वाला है। इस प्रयोजन के लिए, मैं एक IToolStripPopulator
इंटरफेस परिभाषित:
public interface IToolStripPopulator
{
System.Windows.Forms.ToolStrip PopulateToolStrip(System.Windows.Forms.ToolStrip toolstrip, EventHandler itemclick);
}
इस का एक कार्यान्वयन MainForm
में इंजेक्ट किया जाता है, और Load()
विधि ContextMenuStrip
और हैंडलर के रूप में परिभाषित किया गया साथ PopulateToolStrip()
कहता है। पॉप्युलेटर की निर्भरता केवल मेनू आइटम के लिए उपयोग करने के लिए डेटा प्राप्त करने से संबंधित होती है।
इस अमूर्तता ने कुछ विकासवादी कदमों के माध्यम से अच्छी तरह से काम किया है, लेकिन जब मुझे एक से अधिक ईवेंट हैंडलर की आवश्यकता होती है, तो अब पर्याप्त नहीं है, उदा। क्योंकि मैं मेनू आइटम के कई अलग-अलग समूह बना रहा हूं - अभी भी एक IToolStripPopulator
इंटरफ़ेस के पीछे छिपा हुआ है क्योंकि फ़ॉर्म को इसके बारे में चिंतित नहीं होना चाहिए।
जैसा कि मैंने कहा, मुझे लगता है कि मुझे पता है कि सामान्य संरचना की तरह होना चाहिए - मैं कुछ अधिक विशिष्ट करने के लिए IToolStripPopulator
इंटरफ़ेस * नाम दिया और एक नया जिसका PopulateToolStrip()
विधि एक EventHandler
पैरामीटर नहीं ले करता है, जो बजाय में इंजेक्ट किया जाता बनाई ऑब्जेक्ट (कार्यान्वयन आदि द्वारा आवश्यक हैंडलर की संख्या के बारे में अधिक लचीलापन की इजाजत देता है)। इस तरह मेरा "सबसे प्रमुख" IToolStripPopulator
किसी भी विशिष्ट संख्या के लिए बहुत आसानी से एडाप्टर हो सकता है।
अब जो मैं अस्पष्ट हूं, वह है जिस तरह से मुझे EventHandler निर्भरताओं को हल करना चाहिए। मुझे लगता है कि हैंडलर को सभी को MainForm
में परिभाषित किया जाना चाहिए, क्योंकि मेनू की घटनाओं पर उचित प्रतिक्रिया देने के लिए अन्य सभी निर्भरताओं की आवश्यकता है, और यह मेनू का "मालिक" भी है। इसका मतलब यह होगा कि IToolStripPopulator
ऑब्जेक्ट्स के लिए मेरी निर्भरता अंततः मेनफॉर्म में इंजेक्शन वाली MainForm
ऑब्जेक्ट पर Lazy<T>
का उपयोग करके निर्भरताओं को लेने की आवश्यकता होगी।
public interface IClickHandlerSource
{
EventHandler GetClickHandler();
}
यह मेरा MainForm
द्वारा लागू किया गया था, और मेरे विशिष्ट IToolStripPopulator
कार्यान्वयन Lazy<IClickHandlerSource>
पर निर्भरता ले लिया:
मेरी पहली सोचा एक IClickHandlerSource
इंटरफेस को परिभाषित किया गया था। हालांकि यह काम करता है, यह लचीला है। मुझे या तो संभावित रूप से बढ़ती संख्या में हैंडलर (MainForm
कक्षा के साथ ओसीपी का उल्लंघन करने) के लिए अलग-अलग इंटरफेस परिभाषित करना होगा या लगातार IClickHandlerSource
(मुख्य रूप से आईएसपी का उल्लंघन करना) का विस्तार करना होगा। सीधे ईवेंट हैंडलर पर निर्भरता लेना उपभोक्ताओं की तरफ से एक अच्छा विचार दिखता है, लेकिन व्यक्तिगत रूप से आलसी उदाहरण (या जैसा) के गुणों के माध्यम से रचनाकारों को तारों से जोड़ना बहुत गन्दा लगता है - यदि संभव हो तो।
मेरे सबसे अच्छा शर्त वर्तमान में इस प्रतीत हो रहा है:
public interface IEventHandlerSource
{
EventHandler Get(EventHandlerType type);
}
इंटरफ़ेस अभी भी MainForm
द्वारा कार्यान्वित और एक आलसी सिंगलटन के रूप में इंजेक्ट किया जा जाएगा, और EventHandlerType
विभिन्न प्रकार की आवश्यकता के साथ एक कस्टम enum होगा। यह अभी भी बहुत ओसीपी अनुपालन नहीं होगा, लेकिन उचित रूप से लचीला है। EventHandlerType
स्पष्ट रूप से प्रत्येक नए प्रकार के ईवेंट हैंडलर के लिए एक बदलाव होगा, जैसा कि MainForm
में संकल्प तर्क होगा, नए ईवेंट हैंडलर के अलावा और (संभवतः) IToolStripPopulator
के नए लिखित अतिरिक्त कार्यान्वयन के अलावा।
या .... IEventHandlerSource
का एक अलग कार्यान्वयन कि (केवल वस्तु के रूप में) Lazy<MainForm>
पर निर्भरता लेता है और निराकरण MainForm
में परिभाषित विशिष्ट संचालकों को EventHandlerType
विकल्प?
मैं वास्तव में MainForm
से ईवेंट हैंडलर को एक व्यवहार्य तरीके से प्राप्त करने का एक तरीका सोचने की कोशिश कर रहा हूं, लेकिन अभी यह बिल्कुल प्रतीत नहीं होता है।
यहां मेरा सबसे अच्छा विकल्प क्या है, जो कम से कम ईवेंट हैंडलर के सबसे कमजोर युग्मन और सबसे सुरुचिपूर्ण रिज़ॉल्यूशन प्रदान करता है?
[* हाँ, मैं शायद नाम वास्तव में ओसीपी का अनुपालन करने के लिए छोड़ दिया जाना चाहिए था अकेला, लेकिन यह बेहतर है कि जिस तरह से देखा।]
मैं अपने प्रश्न को कई बार पढ़ा लागू है, लेकिन मैं कुछ जानकारी याद कर रहा हूँ। क्या आप अधिक कोड दिखा सकते हैं? उदाहरण के लिए, 'आईवेन्टहैंडलरसोर्स' के उपभोक्ता कैसा दिखते हैं, और 'आईवेन्टहैंडलरसोर्स' के कार्यान्वयन की तरह कैसा दिखता है, और यह सब कैसे पंजीकृत है? – Steven