พื้นหลัง: ฉันกำลังพัฒนากรอบการส่งข้อความ กรอบนี้จะช่วยให้:
- การส่งข้อความผ่านบัสบริการ
- สมัครสมาชิกคิวบนบัสข้อความ
- สมัครสมาชิกหัวข้อบนบัสข้อความ
ขณะนี้เรากำลังใช้ RabbitMQ แต่ฉันรู้ว่าเราจะย้ายไปที่ Microsoft Service Bus (บนสถานที่ตั้ง) ในอนาคตอันใกล้นี้
ฉันวางแผนที่จะสร้างชุดของอินเทอร์เฟซและการใช้งานเพื่อที่ว่าเมื่อเราย้ายไปที่ ServiceBus ฉันก็ต้องจัดเตรียมการใช้งานใหม่โดยไม่ต้องแก้ไขรหัสลูกค้าใด ๆ (เช่นผู้เผยแพร่หรือสมาชิก)
ปัญหาที่นี่คือ RabbitMQ และ ServiceBus ไม่สามารถแปลได้โดยตรง ตัวอย่างเช่น RabbitMQ ขึ้นอยู่กับการแลกเปลี่ยนและชื่อหัวข้อในขณะที่ ServiceBus เป็นข้อมูลเกี่ยวกับ Namespaces และ Queues นอกจากนี้ไม่มีอินเทอร์เฟซทั่วไประหว่างไคลเอนต์ ServiceBus และไคลเอนต์ RabbitMQ (เช่นทั้งสองอาจมีการเชื่อมต่อ ICon แต่อินเทอร์เฟซแตกต่างกัน - ไม่ใช่จากเนมสเปซทั่วไป)
ดังนั้นถึงจุดของฉันฉันสามารถสร้างอินเตอร์เฟซดังต่อไปนี้:
public interface IMessageReceiver{
void AddSubscription(ISubscription subscriptionDetails)
}
เนื่องจากคุณสมบัติที่ไม่สามารถแปลได้ของทั้งสองเทคโนโลยีการปรับใช้ ServiceBus และ RabbitMQ ของอินเทอร์เฟซข้างต้นจึงมีข้อกำหนดที่แตกต่างกัน ดังนั้น RabbitMq ของฉันที่ใช้ IMessageReceiver อาจมีลักษณะเช่นนี้:
public void AddSubscription(ISubscription subscriptionDetails){
if(!subscriptionDetails is RabbitMqSubscriptionDetails){
// I have a problem!
}
}
สำหรับฉันแล้วบรรทัดด้านบนจะแบ่งกฎการทดแทนของ Liskov
ฉันถือว่าการพลิกนี้เพื่อให้การสมัครสมาชิกยอมรับ IMessageConnection แต่อีกครั้งการสมัครสมาชิก RabbitMq จะต้องมีคุณสมบัติเฉพาะของ RabbitMQMessageConnection
ดังนั้นคำถามของฉันคือ:
- ฉันถูกต้องไหมว่าการแบ่ง LSP นี้
- เราเห็นด้วยหรือไม่ว่าในบางกรณีมันเป็นสิ่งที่หลีกเลี่ยงไม่ได้
หวังว่านี่จะชัดเจนและในหัวข้อ!
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>
จะสื่อสารอย่างชัดเจนว่าเป็นที่ยอมรับประเภทและมีความแตกต่างระหว่างการใช้งาน