نحوه استفاده از Dependency Injection با Node.js

Node.js به عنوان یک نیروی مسلط در دنیای توسعه وب ظاهر شده است و به توسعه دهندگان اجازه می دهد تا برنامه های بسیار مقیاس پذیر و کارآمد بسازند. با این حال، با افزایش اندازه و پیچیدگی پروژهها، مدیریت وابستگیها میتواند با Node.js چالشبرانگیز شود. اینجاست که مفهوم تزریق وابستگی مطرح می شود.
استفاده از تزریق وابستگی می تواند معماری و قابلیت نگهداری اپلیکیشن شما را به میزان قابل توجهی افزایش دهد و به توسعه دهندگان این امکان را می دهد تا کدهای جفت شده و ماژولار را بنویسند. در این مقاله، به این خواهیم پرداخت که تزریق وابستگی چیست و چگونه می توان از آن به طور موثر با Node.js استفاده کرد.
تزریق وابستگی یک الگوی طراحی است که وابستگی ها را از یک کلاس یا ماژول جدا می کند و کوپلینگ شل و کد ماژولار را ترویج می کند. در هسته خود، تزریق وابستگی شامل معکوس کردن کنترل ایجاد و مدیریت وابستگی ها است. به جای اینکه یک کلاس وابستگی های خود را ایجاد کند، وابستگی ها به صورت خارجی ارائه می شوند که امکان انعطاف پذیری بهتر و تست آسان تر را فراهم می کند.
چگونه تزریق وابستگی توسعه را ساده می کند
برای درک بهتر مفهوم تزریق وابستگی را با مثال توضیح می دهم.
تصور کنید یک برنامه وب نیاز به اتصال پایگاه داده برای بازیابی و ذخیره داده ها دارد. به جای کدگذاری سخت جزئیات اتصال پایگاه داده در هر ماژول یا کلاس، می توانید از Dependency Injection برای ارائه اتصال پایگاه داده لازم به عنوان یک وابستگی استفاده کنید.
در این سناریو، می توانید یک رابط یا کلاسی را که نشان دهنده اتصال پایگاه داده و عملیات مرتبط با آن است، تعریف کنید. سپس، می توانید نمونه ای از این رابط یا کلاس اتصال پایگاه داده را به ماژول ها یا کلاس هایی که نیاز به دسترسی به پایگاه داده دارند، تزریق کنید.
با این پیاده سازی، با جدا کردن وابستگی به اتصال پایگاه داده از ماژول ها یا کلاس های مصرف کننده، به انعطاف پذیری و ماژولاریت بیشتری دست پیدا می کنید. شما به راحتی می توانید پیاده سازی های مختلف پایگاه داده را تعویض کنید یا از پایگاه های داده ساختگی برای اهداف آزمایشی با تزریق نمونه های مختلف اتصال پایگاه داده استفاده کنید.
بدون تزریق وابستگی چه اتفاقی خواهد افتاد؟
بدون تزریق وابستگی، ماژول ها یا کلاس ها باید مستقیماً شی اتصال پایگاه داده را نمونه سازی کنند و جزئیات اتصال را خودشان مدیریت کنند. این جفت سخت، تعویض پایگاه داده یا انجام تست واحد را به چالش می کشد.
میتوانید با استفاده از تزریق وابستگی، پایگاه کد قابل نگهداری و آزمایشپذیرتری ایجاد کنید. تزریق وابستگی ها امکان مدیریت آسان تر منابع خارجی را فراهم می کند، ماژولار بودن را ارتقا می دهد و پیچیدگی کد را با جداسازی نگرانی ها کاهش می دهد.
Dependency Injection با جدا کردن وابستگی ها از کد، مزایای بی شماری را در توسعه نرم افزار ارائه می دهد.
- افزایش تست پذیری: جدا کردن وابستگیها از کد، جایگزینی آنها با اشیاء ساختگی یا دوبلهای آزمایشی را در طول آزمایش واحد آسان میکند. این اجازه می دهد تا آزمایش جداگانه اجزای جداگانه انجام شود و منجر به پوشش آزمایشی جامع تر و مطمئن تر شود.
- ماژولاریت و قابلیت استفاده مجدد بهبود یافته: Dependency Injection با جداسازی نگرانیهای اجزای مختلف، ماژولار بودن را ارتقا میدهد. هر کامپوننت به وابستگی های خود متکی است که به صراحت از طریق تزریق وابستگی اعلام شده است و درک و حفظ پایگاه کد را آسان تر می کند. این ماژولار بودن همچنین قابلیت استفاده مجدد کد را افزایش میدهد، زیرا اجزا میتوانند به راحتی در زمینهها یا برنامههای مختلف بدون نگرانی در مورد وابستگیهای داخلی آنها دوباره استفاده شوند.
- اتصال شل و مدیریت وابستگی: Dependency Injection با حذف ایجاد وابستگی مستقیم در کد، جفت شدن بین اجزای مختلف را کاهش می دهد. وابستگی ها به صورت خارجی ارائه می شوند و امکان انعطاف پذیری در مبادله یا اصلاح آنها را فراهم می کنند. این اتصال شل، قابلیت نگهداری کلی برنامه را بهبود می بخشد و تغییرات یا به روز رسانی های آینده را ساده می کند.
- مسئولیت منفرد را ترویج می کند: Dependency Injection پیروی از اصل مسئولیت واحد (SRP) را تشویق می کند، که بیان می کند که یک کلاس یا ماژول باید تنها یک دلیل برای تغییر داشته باشد. با تعریف صریح وابستگی ها از طریق تزریق، هر جزء بر مسئولیت خاص خود تمرکز می کند که منجر به کد قابل نگهداری و منسجم تر می شود.
- مقیاس پذیری و انعطاف پذیری: Dependency Injection انعطافپذیری را در مدیریت وابستگیها فراهم میکند و مقیاسبندی و تکامل برنامه را آسانتر میکند. همانطور که پروژه رشد می کند، وابستگی های جدید را می توان به طور یکپارچه معرفی و تزریق کرد بدون اینکه بر پایگاه کد موجود تأثیر بگذارد. این انعطافپذیری به توسعه چابکتر و سازگاری با نیازهای متغیر اجازه میدهد.
- پایگاه کد ساده شده: با بیرونی کردن مسئولیت ایجاد و مدیریت وابستگی ها، تزریق وابستگی پیچیدگی اجزای فردی را کاهش می دهد. کد بیشتر بر روی عملکرد اصلی خود متمرکز می شود، در حالی که وضوح وابستگی و سیم کشی به صورت خارجی انجام می شود.
اکنون که تزریق وابستگی را بهتر درک کردیم، اجازه دهید نحوه پیادهسازی تزریق وابستگی را در Node.js بررسی کنیم.
چندین روش برای اجرای تزریق وابستگی وجود دارد:
- تزریق سازنده
- تزریق ستر
- تزریق اموال
هر کدام از این تکنیک ها مزایا و مزایای خاص خود را دارند. بنابراین درک ویژگی های هر تکنیک برای استفاده بهتر از این تکنیک ها بر اساس نیاز ضروری است.
1. تزریق سازنده
// UserService.js
class UserService {
constructor(dbConnection) {
this.dbConnection = dbConnection;
}
createUser(user) {
/**
* Rest of the implementation here
*/
}
}
// index.js
const mysql = require("mysql");
const UserService = require("./UserService");
// Create a database connection
const dbConnection = mysql.createConnection({
host: "localhost",
user: "your_username",
password: "your_password",
database: "your_database",
});
// Create an instance of UserService with the database connection injected
const userService = new UserService(dbConnection);
// Use the UserService to create a user
const newUser = { name: "John Doe", email: "john@example.com" };
userService.createUser(newUser);
مثال کد بالا یک را نشان می دهد UserService
کلاسی که نیاز به الف دارد dbConnection
وابستگی با استفاده از تزریق سازنده، از آن عبور می کنیم dbConnection
نمونه به عنوان پارامتری برای UserService
سازنده
در index.js
ابتدا با استفاده از کتابخانه MySQL یک اتصال پایگاه داده ایجاد می کنیم. سپس، ما یک نمونه از را ایجاد می کنیم UserService
کلاس با گذراندن dbConnection
شی به عنوان پارامتر سازنده. هنگام فراخوانی createUser
روش بر روی userService
شی، از تزریق شده استفاده می کند dbConnection
برای انجام عملیات پایگاه داده، در این مورد، درج یک رکورد جدید کاربر.
در تزریق سازنده، وابستگیها در امضای سازنده مشخص میشوند، که مشخص میکند که کدام وابستگیها برای عملکرد صحیح کلاس مورد نیاز است. علاوه بر این، اتصال آزاد بین اجزا و مدولار بودن را ترویج میکند و با استفاده از اشیاء ساختگی یا خرد برای نشان دادن وابستگیها در طول آزمایش واحد، آزمایش را ساده میکند.
2. تزریق ستر
// UserService.js
class UserService {
setDbConnection(dbConnection) {
this.dbConnection = dbConnection;
}
createUser(user) {
/**
* Rest of the implementation here
*/
}
}
// index.js
const mysql = require("mysql");
const UserService = require("./UserService");
// Create a database connection
const dbConnection = mysql.createConnection({
host: "localhost",
user: "your_username",
password: "your_password",
database: "your_database",
});
// Create an instance of UserService
const userService = new UserService();
// Set the database connection using the setter method
userService.setDbConnection(dbConnection);
// Use the UserService to create a user
const newUser = { name: "John Doe", email: "john@example.com" };
userService.createUser(newUser);
قطعه کد بالا یک را نشان می دهد UserService
کلاسی که نیاز به الف دارد dbConnection
وابستگی در این سناریو، ما از متد set استفاده می کنیم dbConnection
ویژگی برای عبور از وابستگی.
را UserService
کلاس یک دارد setDbConnection
روشی که به ما امکان می دهدdbConnection
وابستگی خارجی در index.js
ابتدا با استفاده از کتابخانه MySQL یک اتصال پایگاه داده ایجاد می کنیم. سپس، ما یک نمونه از را ایجاد می کنیم UserService
کلاس و استفاده کنید setDbConnection
روشی برای ارائه dbConnection
هدف – شی. سپس هنگام استناد به createUser
روش بر روی userService
شی، از تزریق شده استفاده می کند dbConnection
برای انجام عملیات پایگاه داده
تزریق Setter به توسعهدهنده اجازه میدهد تا از روشهای مجموعه برای عبور از وابستگیها استفاده کند. این به شما امکان میدهد تا پس از ایجاد شیء، وابستگیها را فراهم کنید و آن را برای تنظیم یا تغییر وابستگیها در صورت نیاز انعطافپذیر میسازد. این اتصال شل را ترویج می کند و امکان جداسازی بهتر نگرانی ها را فراهم می کند.
3. تزریق اموال
// UserService.js
class UserService {
createUser(user) {
/**
* Rest of the implementation here
*/
}
}
// index.js
const mysql = require('mysql');
const UserService = require('./UserService');
// Create a database connection
const dbConnection = mysql.createConnection({
host: 'localhost',
user: 'your_username',
password: 'your_password',
database: 'your_database',
});
// Create an instance of UserService
const userService = new UserService();
// Set the database connection as a property
userService.dbConnection = dbConnection;
// Use the UserService to create a user
const newUser = { name: 'John Doe', email: 'john@example.com' };
userService.createUser(newUser);
قطعه کد بالا یک را نشان می دهد UserService
کلاسی که نیاز به الف داردdbConnection
وابستگی به ایجاد کاربران در پایگاه داده در اینجا، ما از تزریق ویژگی برای انتقال وابستگی به آن استفاده می کنیم UserService
.
را UserService
کلاس یک دارد dbConnection
دارایی که می توانیم مستقیماً به آن اختصاص دهیم dbConnection
هدف – شی. هنگام فراخوانی createUser
روش بر رویuserService
شی، از تزریق شده استفاده می کند dbConnection
برای انجام عملیات پایگاه داده
همانطور که در مثال نشان داده شده است، Property Injection به شما اجازه می دهد که وابستگی ها را مستقیماً به ویژگی های یک شی اختصاص دهید. این انعطاف پذیری را در مدیریت وابستگی ها فراهم می کند و امکان تغییر یا تعویض آسان وابستگی ها را در زمان اجرا فراهم می کند.
اگرچه Node.js پشتیبانی داخلی برای تزریق وابستگی ارائه نمی دهد، چندین کتابخانه و فریم ورک محبوب در اکوسیستم Node.js از تزریق وابستگی پشتیبانی می کنند.
به عنوان مثال، NestJS یکی از فریمورکهای پیشرو با ویژگیهای کامل مبتنی بر Node.js است و انتخاب شخصی ما در Amplication برای ساخت برنامههای سمت سرور کارآمد، قابل اعتماد و مقیاسپذیر است. NestJS پشتیبانی داخلی برای تزریق وابستگی ارائه می دهد. ظرف DI در NestJS مسئول حل و فصل وابستگی ها و مدیریت آن است. امضاهای سازنده کلاس ها را تجزیه و تحلیل می کند و به طور خودکار وابستگی های مورد نیاز را بر اساس ارائه دهندگان ثبت شده آنها حل می کند. میتوانید اطلاعات بیشتری درباره تزریق وابستگی NestJS در مستندات آنها بیابید.
اما آیا میدانستید راهی برای سادهتر کردن فرآیند نوشتن خدمات باطن NestJS و لذت بردن از DI قدرتمند NestJS وجود دارد؟
Amplication چگونه می تواند کمک کند
Amplication یک ابزار رایگان و متن باز است که با ایجاد سرویس های Node.js کاملاً کاربردی، توسعه را سرعت می بخشد. Amplication با رابط بصری کاربر پسند و قابلیت های تولید کد، ساخت برنامه های کاربردی مقیاس پذیر را ساده می کند. با تعریف مدل داده خود در Amplication، می توانید به طور خودکار کدها و تنظیمات لازم را ایجاد کنید تا از تزریق وابستگی قوی NestJS سریعتر از همیشه لذت ببرید. این کار نیاز به پیکربندی دستی را از بین می برد و تلاش لازم برای راه اندازی را کاهش می دهد.
تزریق وابستگی (DI) یک تکنیک قدرتمند است که مزایای قابل توجهی را برای توسعه Node.js به ارمغان می آورد. با جدا کردن وابستگیها از کلاسها یا ماژولها، DI اتصال شل را ترویج میکند، ماژولار بودن را افزایش میدهد و آزمایشپذیری، نگهداری و مقیاسپذیری برنامههای شما را بهبود میبخشد. تزریق سازنده، تزریق ستر و تزریق دارایی مزایا و مزایای خاص خود را ارائه می دهند و به شما این امکان را می دهند که مناسب ترین رویکرد را بر اساس نیازهای خاص خود انتخاب کنید.
تزریق وابستگی به شما امکان می دهد کدهای تمیزتر، ماژولارتر و به راحتی قابل آزمایش را در برنامه های Node.js خود بنویسید. با درک اصول و تکنیکهای تزریق وابستگی، میتوانید سیستمهای قوی و مقیاسپذیری بسازید که با نیازهای متغیر سازگار شوند و راهحلهای نرمافزاری با کیفیت بالا ارائه کنند.
علاوه بر این، میتوانید از چارچوبهای مبتنی بر Node.js مانند NestJS و ابزارهای مدرن مانند Amplication برای سادهسازی بیشتر تزریق وابستگی استفاده کنید. Amplication به شما امکان می دهد خدمات باطن NestJS را با چند کلیک ایجاد کنید و تلاش دستی و تنظیمات مورد نیاز برای پیاده سازی تزریق وابستگی برای برنامه های Node.js را کاهش می دهد. امروز Amplication را امتحان کنید و شاهد توسعه کارآمد Node.js باشید.