2012-04-30 19 views
7

मैंने कुछ WinForms अनुप्रयोगों में एमवीपी पैटर्न लागू किया है जो निष्क्रिय दृश्य का उपयोग करता है। मैं एक्शन < टी> और Func < टी> के रूप में गुणों और प्रतिनिधियों वाले एक इंटरफेस को ठोस दृश्यों में यूआई घटनाओं को तारित करने और प्रस्तुतकर्ता को वापस कॉल करने के लिए लागू करता हूं।एमवीपी, विनफॉर्म - इवेंट हैंडलर या प्रतिनिधि

मैं एक नई परियोजना शुरू करने जा रहा हूं और यहां पैटर्न के कई उदाहरणों सहित ऑनलाइन पैटर्न में थोड़ा सा शोध किया है और ध्यान दें कि सभी इवेंट हैंडलर को प्रस्तुतकर्ताओं को सूचित करने के लिए उपयोग करते हैं।

मुझे वास्तव में समझ में नहीं आता कि इस मामले में घटनाओं का उपयोग क्यों किया जाएगा, क्योंकि मुझे केवल एक प्रस्तुतकर्ता होने के रूप में एक दृश्य दिखाई देता है।

मेरा सवाल यह है कि, नेट फ्रेमवर्क घटनाओं का उपयोग कैसे करता है, या किसी अन्य कारण के लिए जो मैं नहीं देख रहा हूं, के अनुरूप है?

यहाँ पैटर्न मैं उपयोग की एक छोटी सी उदाहरण है:

public interface IViewAbstraction 
{ 
    public ModelData ModelData { set; } 
    public Action<ModelData> ModelDataChangedCallback { set; } 
} 

public class SomeWinForm : Form, IViewAbstraction 
{ 
    private Action<ModelData> modelDataChanged; 
    private ModelData model; 

    public ModelData ModelData 
    { 
     set { /* when this property changes, update UI */ } 
    } 

    public Action<ModelData> ModelDataChangedCallback 
    { 
     set { modelDataChanged = value; } 
    } 

    private void OnSomeWinformsEvent(EventArgs args) 
    { 
     if (modelDataChanged == null) throw new Exception(); 

     modelDataChanged(model); 
    } 
} 

public class Presenter 
{ 
    private readonly IViewAbstraction view; 
    private readonly IDataLayerAbstraction dataLayer; 

    public Presenter(IViewAbstraction view, IDataLayerAbstraction dataLayer) 
    { 
     this.dataLayer = dataLayer; 
     this.view = view; 
     this.view.ModelDataChangedCallback = OnModelChanged; 
     this.view.ModelData = dataLayer.GetData(); 
    } 

    private void OnModelChanged(ModelData data) 
    { 
     // validate and save data. 
    } 
} 

उत्तर

4

आपका पैटर्न अनिवार्य रूप से, घटनाओं का उपयोग कर एक महत्वपूर्ण अंतर के साथ के रूप में ही है। घटनाएं अंतर्निहित प्रतिनिधि (आपके उदाहरण में ModelDataChangedCallback) का पर्दाफाश नहीं करती हैं। इसका खुलासा करना बुरा अभ्यास है क्योंकि अन्य कोड उदाहरण के लिए आमंत्रण सूची को साफ़ कर सकते हैं। एक कार्यक्रम में एक अंतर्निहित प्रतिनिधि होगा जिसे जोड़ा जा सकता है या हटाया जा सकता है, लेकिन कक्षा के दायरे से बाहर कभी भी मंजूरी नहीं दी जाती है।

मुझे कई ग्राहकों के बारे में आपकी बात समझ में नहीं आ रही है - यह घटनाओं का उपयोग न करने का एक कारण नहीं है। एक कार्यक्रम एक वर्ग के लिए सिर्फ एक तरीका है "अरे! यह बात हुई है", एक प्रस्तुतकर्ता वस्तु के साथ 1-से-1 मैपिंग पूरी तरह से उचित और सामान्य है।

आप दृश्य में केवल अजीब लग रही लेखन-केवल संपत्ति के साथ समाप्त नहीं होते हैं।

+0

केवल लिखने वाले गुणों पर सहमत है, जब मैं उन्हें देखता हूं तो मुझे यह बग करता है और जटिल विचारों के मुकाबले अधिक बॉयलरप्लेट कोड जोड़ता है। –

+0

लेकिन किसी ईवेंट का उपयोग करते समय उसे उस डेटा को रखने के लिए केवल एक विशिष्ट 'ModelDataChangedEventArgs' क्लास बनाना होगा, जिसे प्रस्तुतकर्ता को काम करने की ज़रूरत है, है ना? जब कई घटनाएं होती हैं, तो बॉयलर प्लेट कक्षाओं की संख्या का खुलासा होगा। सभी 'एक्शन माईडिलेगेट' को 'EventHandler MyEvent' में बदला जाना है ... चूंकि यह 1: 1 मैपिंग है, इसलिए किसी को आमंत्रित करने की सूची को साफ़ करने की संभावना बहुत सीमित होनी चाहिए ... –

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