2008-09-23 14 views
8

हालांकि मेरा प्रश्न अमूर्त प्रतीत हो सकता है, मुझे उम्मीद है कि यह नहीं है। मान लीजिए कि मैं एक एप्लीकेशन विकसित करता हूं, एक एएसपी.नेट एमवीसी साइट और बाद में मुझे इस एप्लिकेशन के लिए एक विनफॉर्म क्लाइंट बनाने का काम सौंपा गया है, मैं मौजूदा एप्लिकेशन से कितना और कैसे उपयोग कर सकता हूं?पुन: उपयोग एमवीसी अरहिटेक्चर; यूआई की दो परतें हैं: एएसपी.नेट एमवीसी और .NET Winforms

मैंने मॉडलों को परिभाषित किया, मैंने नियंत्रकों और विचारों को परिभाषित किया। वे सभी अच्छी तरह से काम करते हैं।

अब बॉस एक विनफॉर्म क्लाइंट के लिए पूछता है और मुझे उम्मीद है कि मैं मॉडल और नियंत्रकों का पुन: उपयोग कर सकता हूं (बशर्ते मैंने उन्हें अलग-अलग असेंबली में रखा हो) और केवल विचारों (एएसपीएक्स विचारों) का पुन: उपयोग न करें।

यह किया जा सकता है? कैसे?

उत्तर

10

मैंने पहले यह किया है, एएसपीनेट एमवीसी के साथ नहीं बल्कि शुद्ध एएसपीनेट वेब फॉर्म के साथ। मैंने घर से उगाए गए एमवीपी (मॉडल-व्यू-प्रेजेंटर) पैटर्न का उपयोग किया, और WinForms ऐप में प्रेजेंटर (== आपके मामले में नियंत्रक) का उपयोग करने की अनुमति देने के लिए सबसे महत्वपूर्ण बात यह थी कि कुछ भी करने के लिए संदर्भित नहीं किया गया था system.web

तो सबसे पहले आपको जो करना है, वह किसी भी अनुरोध, प्रतिक्रिया, वेब इत्यादि को लपेटने के लिए इंटरफ़ेस (ओं) पेश करना है, और प्रत्येक प्रस्तुतकर्ता निर्भरता इंजेक्शन के माध्यम से इन इंटरफेस को स्वीकार करता है (या उन्हें उपलब्ध कराता है प्रस्तुतकर्ता किसी अन्य तकनीक द्वारा), तो यदि प्रेजेंटर वास्तविक system.web सामान के बजाय उन का उपयोग करता है।

उदाहरण:

कल्पना कीजिए कि आप पृष्ठ B पर पृष्ठ A से नियंत्रण (जो आपके WinForms में एप्लिकेशन आपको फार्म एक तो खुले रूप बी बंद करने के लिए चाहते हो सकता है) को स्थानांतरित करना चाहते।

इंटरफ़ेस:

public interface IRuntimeContext 
{ 
    void TransferTo(string destination); 
} 

वेब कार्यान्वयन:

public class AspNetRuntimeContext 
{ 
    public void TransferTo(string destination) 
    { 
    Response.Redirect(destination); 
    } 
} 

WinForms कार्यान्वयन:

public class WinformsRuntimeContext 
{ 
    public void TransferTo(string destination) 
    { 
    var r = GetFormByName(destination); 
    r.Show(); 
    } 
} 

अब प्रस्तुतकर्ता (आपके मामले में नियंत्रक):

public class SomePresenter 
{ 
    private readonly runtimeContext; 
    public SomePresenter(IRuntimeContext runtimeContext) 
    { 
    this.runtimeContext = runtimeContext; 
    } 

    public void SomeAction() 
    { 
    // do some work 

    // then transfer control to another page/form 
    runtimeContext.TransferTo("somewhereElse"); 
    } 
} 

मैंने एएसपीएनटी एमवीसी कार्यान्वयन को विस्तार से नहीं देखा है, लेकिन मुझे आशा है कि इससे आपको कुछ संकेत मिलेगा कि यह आपके परिदृश्य को सक्षम करने के लिए शायद बहुत काम करेगा।

आप इसके बजाय स्वीकार करना चाहते हैं कि आपको विभिन्न प्लेटफार्मों के लिए व्यू और कंट्रोलर को फिर से कोड करना होगा, और इसके बजाय अपने नियंत्रकों को बेहद पतला रखने और सेवा कोड में अपना कोड डालने पर ध्यान केंद्रित करना होगा साझा किया जाना

शुभकामनाएं!

+1

मेरी इच्छा है कि मैं आपको दो बार वोट दे सकता हूं, यह एक अच्छा जवाब है! –

2

Northwind starter kit पर देखें (नॉर्थविंड बिट द्वारा बंद न करें) - जिसमें एमवीसी और विनफॉर्म दोनों सहित एक स्तरित आर्किटेक्चर से जुड़े विभिन्न जीयूआई हैं।

यह वही करता है जो आप प्राप्त करना चाहते हैं।