मैं एक सेवा को कैसे लपेटता हूं ताकि यह सरल हो


11

हमारे पास एक तृतीय-पक्ष सेवा के लिए एक निर्भरता है जो एक विशाल इंटरफ़ेस को उजागर करती है जिसमें हमें केवल 3 विधियों की आवश्यकता होती है। इसके अतिरिक्त, इंटरफ़ेस अक्सर बदलता रहता है ...

मैंने अपनी परियोजना में एक वर्ग में इंटरफ़ेस को लपेटने का फैसला किया है और केवल उन तरीकों को उजागर करता है जिनकी हमें ज़रूरत है।

लेकिन मैं अनिश्चित हूं कि मुझे वापसी मूल्यों को कैसे संभालना चाहिए ... इंटरफ़ेस एक प्रकार की वस्तु देता है Storage। हमारे पास आंतरिक रूप से एक प्रकार है StorageModelजो हमारा आंतरिक प्रतिनिधित्व है Storage

आप मैपर में क्या लौटाएंगे: Storageया StorageModel? हमारे पास एक DataService है StorageServiceजो आवरण के एक इंजेक्शन की निर्भरता प्राप्त करता है।

वर्तमान में मैं इसे मूल रूप से इस तरह कर रहा हूं:

public class StorageService 
{
    private readonly IExternalStorageWrapper externalStorageWrapper;

    public StorageService(IExternalStorageWrapper externalStorageWrapper)
    {
        this.externalStorageWrapper = externalStorageWrapper;
    }

    public StorageModel GetStorage(int storageId)
    {
        return this.externalStorageWrapper.GetStorage(storageId).ConvertToStorageModel();
    }
}

public class ExternalStorageWrapper : IExternalStorageWrapper
{
    public Storage GetStorage(int storageId)
    {
        using(var ext = new ExternalStorage())
        {
            return ext.GetStorage(storageId);
        }
    }
}

आप क्या कहेंगे:

  • क्या यह ऊपर की तरह अच्छा है, कि आवरण बाहरी Storageवस्तु को StorageServiceलौटाता है और आंतरिक आंतरिक लौटाता है StorageModel?
  • या आप StorageModelपहले से ही रैपर में वापस आ जाएंगे ?

2
आप इसे रैपर क्यों कहते हैं? मुखौटे के लिए बेहतर देखो-, पुल- और एडेप्टर-पैटर्न। जैसा कि मैं समझता हूं, एक आवरण तीसरे पक्ष की सेवा के सभी तरीके प्रदान करेगा - लेकिन यह वह नहीं है जो आप चाहते हैं।
टोबियास ओटो


@TobiasOtto एक आवरण में लपेटे गए ऑब्जेक्ट के व्यवहार को उजागर करने की आवश्यकता नहीं है, इस लेख को "एक सीमित आवरण" में देखें।
गुरिल्ला ०३

जवाबों:


11

मेरे विकल्प में, आवरण को बाहरी पुस्तकालय से संबंधित सभी चीजों से निपटना चाहिए। इसका मतलब है कि रैपर के सार्वजनिक इंटरफ़ेस में किसी भी बाहरी प्रकार का नाम नहीं होना चाहिए।

बाहरी प्रकारों को आपके आवेदन के संबंधित प्रकारों में मैप करना रैपर के कर्तव्यों का हिस्सा है। यदि यह एक तुच्छ कार्य नहीं है, तो आप समस्या को विघटित करने के लिए उपलब्ध विभिन्न उपकरणों का उपयोग कर सकते हैं, जैसे कि अनुवादक वस्तु को इंजेक्ट करना। हालांकि, अनुवादक को अभी भी आपके रैपर मॉड्यूल का हिस्सा होना चाहिए, और आपके आवेदन का कोई अन्य हिस्सा इस पर निर्भर नहीं हो सकता है।

इस तरह, आपके बाकी एप्लिकेशन पूरी तरह से न केवल पुस्तकालय में परिवर्तन के लिए, बल्कि एक दूसरे के लिए पुस्तकालय के प्रतिस्थापन के लिए भी प्रतिरक्षा हैं।


3

मैंने अपनी परियोजना में एक वर्ग में इंटरफ़ेस को लपेटने का फैसला किया है और केवल उन तरीकों को उजागर करता है जिनकी हमें ज़रूरत है।

ठीक है। इसे एडॉप्टर के रूप में भी जाना जाता है ।

आप चुन सकते हैं एडाप्टर इसलिए यहाँ लक्ष्य रहा है पैटर्न, बदलने एक इंटरफेस एक और (डोमेन मॉडल) में (पुस्तकालय मॉडल)। इसलिए, यदि पूर्व से कुछ डोमेन मॉडल तक पहुंचता है, तो एडाप्टर अपने उद्देश्य में विफल हो रहा है

पिछले तर्कों के अनुसार, एडेप्टर को वापस लौटना चाहिए StorageModel

अंततः, आपका डोमेन एक विशिष्ट भाषा "बोलता है", जहां Storageएक अजनबी है

लेकिन मैं अनिश्चित हूं कि मुझे वापसी मूल्यों को कैसे संभालना चाहिए ...

यहां पर यह जानना महत्वपूर्ण है कि आप लाइब्रेरी को किस कारण से रैप कर रहे हैं / बदल रहे हैं

एडाप्टर, डेकोरेटर, मुखौटा पैटर्न में समानता हो सकती है लेकिन वे काफी अलग हैं। अलग-अलग समस्याओं के रूप में वे हल करते हैं।

उस ने कहा, आप में भी रुचि हो सकती है:


1

आप इसे डुप्लिकेट करके किसी लाइब्रेरी को प्रभावी रूप से नहीं लपेट सकते।

आपको क्या लपेटना चाहिए क्या आप पुस्तकालय का उपयोग करते हैं और इसका मतलब है कि वस्तुओं को उजागर नहीं करना, इस मामले में भंडारण। उन्हें डुप्लिकेट करने का प्रयास न करें।

पुस्तकालय का उपयोग करें, लेकिन इसे निहित रखें। तो आपके मामले में, स्टोरेज सर्विस का उपयोग करके चीजों को स्टोर करने के लिए आपको इसे रिपॉजिटरी में लपेटना चाहिए

MyPocoObjectRepo
    MyPocoObject GetObject(string id);

जहां MyPocoObject पूरी तरह से आपके डेटा और व्यावसायिक तर्क है। भंडारण या एक DataReader या कुछ भी का दोहराव नहीं


0

इसका उत्तर यह है कि यह इस बात पर निर्भर करता है कि आपको कभी Storageउस वर्ग से सीधे संपर्क करने की आवश्यकता है या नहीं StorageModel

यदि आप पुस्तकालय को लपेटने जा रहे हैं, तो इससे आपको भविष्य में पुस्तकालय द्वारा किए गए भविष्य के प्रमाण में परिवर्तन करने के लिए उसके द्वारा दी गई वस्तु को भी लपेटने की समझ में आता है। हालांकि अगर आपको कभी Storageसीधे उपयोग करने की आवश्यकता होती है , तो इसका मतलब है कि स्थिति के अनुसार लौटने की आवश्यकता हो सकती Storageहै। एक तर्क के रूप में Storageयहाँ उपयोग के लिए बाध्य करने के लिए कहा जा सकता है StorageModelजैसा कि आप अपने पूरे कार्यक्रम में लगातार बने रहना चाहते हैं।

यदि आप पहले से ही ऐसा नहीं कर रहे हैं, तो मैं आपको इंटरफ़ेस और लौटी हुई वस्तु दोनों को लपेटने की जोरदार सलाह दूंगा, हालांकि फिर से, यह केवल तभी समझ में आता है जब आप केवल StorageModelअपने पूरे कार्यक्रम का उपयोग कर रहे हों और नहीं Storage

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.