Meneroka sistem suntikan kebergantungan NestJS mencetuskan penyelaman yang lebih mendalam ke dalam Penyongsangan Ketergantungan, Penyongsangan Kawalan dan Suntikan Ketergantungan. Konsep ini, walaupun kelihatan serupa, menawarkan penyelesaian yang berbeza untuk masalah yang berbeza. Penjelasan ini berfungsi sebagai penyegar peribadi, dan semoga panduan berguna untuk orang lain yang bergelut dengan istilah ini.
Definisi: Modul peringkat tinggi tidak seharusnya bergantung pada modul peringkat rendah; kedua-duanya harus bergantung pada abstraksi. Abstraksi tidak seharusnya bergantung pada butiran; butiran harus bergantung pada abstraksi.
Dalam perisian, modul peringkat tinggi merangkumi logik perniagaan teras, manakala modul peringkat rendah mengendalikan pelaksanaan tertentu (pangkalan data, API, dll.). Tanpa DIP, modul peringkat tinggi bergantung secara langsung pada modul peringkat rendah, mewujudkan gandingan ketat yang menghalang fleksibiliti, merumitkan ujian dan penyelenggaraan serta menyukarkan penggantian atau melanjutkan butiran peringkat rendah.
DIP membalikkan hubungan ini. Daripada kawalan langsung, kedua-dua modul peringkat tinggi dan rendah bergantung pada abstraksi yang dikongsi (antara muka atau kelas abstrak).
<code class="language-python">class EmailService: def send_email(self, message): print(f"Sending email: {message}") class Notification: def __init__(self): self.email_service = EmailService() def notify(self, message): self.email_service.send_email(message)</code>
<code class="language-typescript">class EmailService { sendEmail(message: string): void { console.log(`Sending email: ${message}`); } } class Notification { private emailService: EmailService; constructor() { this.emailService = new EmailService(); } notify(message: string): void { this.emailService.sendEmail(message); } }</code>
Masalah:
Notification
secara langsung bergantung pada EmailService
.SMSService
memerlukan pengubahsuaian Notification
.<code class="language-python">from abc import ABC, abstractmethod class MessageService(ABC): @abstractmethod def send_message(self, message): pass class EmailService(MessageService): def send_message(self, message): print(f"Sending email: {message}") class Notification: def __init__(self, message_service: MessageService): self.message_service = message_service def notify(self, message): self.message_service.send_message(message) # Usage email_service = EmailService() notification = Notification(email_service) notification.notify("Hello, Dependency Inversion!")</code>
<code class="language-typescript">interface MessageService { sendMessage(message: string): void; } class EmailService implements MessageService { sendMessage(message: string): void { console.log(`Sending email: ${message}`); } } class Notification { private messageService: MessageService; constructor(messageService: MessageService) { this.messageService = messageService; } notify(message: string): void { this.messageService.sendMessage(message); } } // Usage const emailService = new EmailService(); const notification = new Notification(emailService); notification.notify("Hello, Dependency Inversion!");</code>
IoC ialah prinsip reka bentuk di mana kawalan kebergantungan beralih kepada sistem luaran (rangka kerja) dan bukannya diuruskan dalam kelas. Secara tradisinya, kelas mencipta dan mengurus kebergantungannya. IoC membalikkan perkara ini—entiti luaran menyuntik kebergantungan.
<code class="language-python">class SMSService: def send_message(self, message): print(f"Sending SMS: {message}") class Notification: def __init__(self): self.sms_service = SMSService() # Dependency created internally def notify(self, message): self.sms_service.send_message(message)</code>
<code class="language-typescript">class SMSService { sendMessage(message: string): void { console.log(`Sending SMS: ${message}`); } } class Notification { private smsService: SMSService; constructor() { this.smsService = new SMSService(); // Dependency created internally } notify(message: string): void { this.smsService.sendMessage(message); } }</code>
Masalah Tanpa IoC:
<code class="language-python">class EmailService: def send_email(self, message): print(f"Sending email: {message}") class Notification: def __init__(self): self.email_service = EmailService() def notify(self, message): self.email_service.send_email(message)</code>
<code class="language-typescript">class EmailService { sendEmail(message: string): void { console.log(`Sending email: ${message}`); } } class Notification { private emailService: EmailService; constructor() { this.emailService = new EmailService(); } notify(message: string): void { this.emailService.sendEmail(message); } }</code>
DI ialah teknik di mana objek menerima kebergantungannya daripada sumber luaran. Ia merupakan pelaksanaan praktikal IoC, menyuntik kebergantungan melalui:
injector
)<code class="language-python">from abc import ABC, abstractmethod class MessageService(ABC): @abstractmethod def send_message(self, message): pass class EmailService(MessageService): def send_message(self, message): print(f"Sending email: {message}") class Notification: def __init__(self, message_service: MessageService): self.message_service = message_service def notify(self, message): self.message_service.send_message(message) # Usage email_service = EmailService() notification = Notification(email_service) notification.notify("Hello, Dependency Inversion!")</code>
tsyringe
)<code class="language-typescript">interface MessageService { sendMessage(message: string): void; } class EmailService implements MessageService { sendMessage(message: string): void { console.log(`Sending email: ${message}`); } } class Notification { private messageService: MessageService; constructor(messageService: MessageService) { this.messageService = messageService; } notify(message: string): void { this.messageService.sendMessage(message); } } // Usage const emailService = new EmailService(); const notification = new Notification(emailService); notification.notify("Hello, Dependency Inversion!");</code>
Penjelasan terperinci ini menjelaskan perhubungan dan perbezaan antara DIP, IoC dan DI, menekankan sumbangan individu mereka untuk membina perisian yang teguh dan boleh diselenggara.
Atas ialah kandungan terperinci Memecahkan Penyongsangan Ketergantungan, IoC dan DI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!