बैकग्राउंड: मैं एक मैसेजिंग फ्रेमवर्क विकसित कर रहा हूं। यह ढांचा अनुमति देगा:
- सेवा बस पर संदेश भेजना
- संदेश बस में कतारों की सदस्यता लेना
- संदेश बस में विषयों की सदस्यता लेना
हम वर्तमान में RabbitMQ का उपयोग कर रहे हैं, लेकिन मुझे पता है कि हम निकट भविष्य में Microsoft सेवा बस (परिसर में) पर जा रहे हैं।
मैं इंटरफेस और कार्यान्वयन का एक सेट बनाने की योजना बना रहा हूं ताकि जब हम सर्विसबस में जाएं, तो मुझे बस क्लाइंट कोड (अर्थात प्रकाशक या ग्राहक) में संशोधन किए बिना एक नया कार्यान्वयन प्रदान करना होगा।
यहाँ मुद्दा यह है कि RabbitMQ और ServiceBus सीधे अनुवाद योग्य नहीं हैं। उदाहरण के लिए, RabbitMQ एक्सचेंजों और टॉपिक नामों पर निर्भर करता है, जबकि सर्विसबस सभी नामस्थानों और क्वीन्स के बारे में है। इसके अलावा, ServiceBus क्लाइंट और RabbitMQ क्लाइंट के बीच कोई आम इंटरफेस नहीं है (उदाहरण के लिए दोनों में एक IConnection हो सकता है, लेकिन इंटरफ़ेस अलग है - एक सामान्य नामस्थान से नहीं)।
तो मेरी बात पर, मैं एक इंटरफ़ेस बना सकता है:
public interface IMessageReceiver{
void AddSubscription(ISubscription subscriptionDetails)
}
दो प्रौद्योगिकियों के गैर-अनुवाद योग्य गुणों के कारण, उपरोक्त इंटरफ़ेस के सर्विसबस और रैबिटएमक्यू कार्यान्वयनों की अलग-अलग आवश्यकताएं हैं। तो मेरा RabbitMq IMessageReceiver का इम्प्लांटेशन इस तरह दिख सकता है:
public void AddSubscription(ISubscription subscriptionDetails){
if(!subscriptionDetails is RabbitMqSubscriptionDetails){
// I have a problem!
}
}
मेरे लिए, ऊपर की लाइन प्रतिस्थापन की Liskov के नियम को तोड़ती है।
मैंने इसे इधर-उधर फ़्लिप करने पर विचार किया, ताकि एक सदस्यता एक IMessageConnection को स्वीकार कर ले, लेकिन फिर से RabbitMq सदस्यता को RabbitMQMessageConnection के विशिष्ट गुणों की आवश्यकता होगी।
तो, मेरे सवाल हैं:
- क्या मैं सही हूं कि इससे एलएसपी टूट जाता है?
- क्या हम इस बात से सहमत हैं कि कुछ मामलों में यह अपरिहार्य है, या, क्या मुझे कुछ याद आ रहा है?
उम्मीद है, यह स्पष्ट और विषय पर है!
interface IMessageReceiver<T extends ISubscription>{void AddSubscription(T subscriptionDetails); }
। एक कार्यान्वयन तब public class RabbitMqMessageReceiver implements IMessageReceiver<RabbitMqSubscriptionDetails> { public void AddSubscription(RabbitMqSubscriptionDetails subscriptionDetails){} }
(जावा में) जैसा दिख सकता है ।
interface TestInterface<T extends ISubscription>
ऐसा स्पष्ट रूप से संवाद करेगा कि कौन से प्रकार स्वीकार किए जाते हैं, और यह कि कार्यान्वयन के बीच अंतर हैं।