آشنایی با DTO( Data transfer object )
DTO چیست؟
DTO مخفف Data Transfer Object است؛ یک کلاس ساده بدون منطق تجاری که تنها هدف آن، انتقال داده بین لایههای مختلف اپلیکیشن میباشد.
بر خلاف Entityها یا Modelها که ممکن است شامل رفتار (Behavior)، متدها یا ویژگیهایی خاص باشند، DTOها فقط شامل ویژگیهایی (Properties) هستند که باید بین لایهها رد و بدل شوند.
چرا از DTO استفاده میکنیم؟
تصور کنید شما یک پروژه ASP.NET Core دارید با معماری لایهای شامل:
Domain Layer (دامنه): شامل Entityها و منطق تجاری
Application Layer (لایه کاربردی): شامل سرویسهای اپلیکیشن
Presentation Layer (لایه نمایش): مانند API یا Razor Pages
اگر قرار باشد مستقیماً Entityها را از پایگاه داده دریافت کرده و به API بازگردانید، مشکلات زیر بهوجود میآید:
🛑 مشکلات استفاده مستقیم از Entityها:
نشت اطلاعات: ممکن است فیلدهایی مثل PasswordHash، IsDeleted یا UserRole به کلاینت ارسال شود.
وابستگی غیرضروری: Entityها معمولاً شامل وابستگی به EF Core هستند، و استفاده از آنها در لایه API باعث ایجاد وابستگی غیرمستقیم به ORM میشود.
انعطافپذیری کم: اگر نیاز به نمایش فیلدهای ترکیبی یا محاسبهشده دارید، نمیتوانید این کار را با Entity انجام دهید مگر با تغییر در خود آن.
✅ مزایای استفاده از DTO
افزایش امنیت دادهها: فقط اطلاعاتی که باید به کلاینت نمایش داده شود را ارسال میکنید.
انعطافپذیری در نمایش: میتوانید فیلدهای دلخواه یا ترکیبی (مثل FullName) را تعریف کنید.
جدا کردن مدل دامنه از مدل نمایش: این کار باعث نگهداری بهتر و سادهتر اپلیکیشن میشود.
سادگی تستنویسی: چون DTOها ساده هستند، تستکردن سرویسها آسانتر است.
سازگاری بهتر با APIهای REST یا gRPC: ساختار داده خروجی با نیاز کلاینت هماهنگ میشود.
📌 چه زمانی باید از DTO استفاده کنیم؟
استفاده از DTO در شرایط مختلفی از توسعه نرمافزار، توصیه میشود. در اینجا به مهمترین آنها اشاره میکنیم:
هنگام ارسال داده از API به کلاینت: زمانی که قصد دارید دادههایی را از سمت سرور به کلاینت ارسال کنید، استفاده از DTO بسیار مناسب است. این کار باعث میشود فقط اطلاعات ضروری به کاربر ارسال شود و جزئیات اضافی یا حساس از دید کاربر مخفی بماند.
هنگام دریافت داده از کلاینت: زمانی که کاربر فرم یا درخواستی را ارسال میکند، بهتر است دادههای ورودی را در قالب یک DTO دریافت کنید تا ساختار مشخص، قابل بررسی و امنتری برای پردازش داشته باشید.
بین سرویسها در لایه Application: گاهی لازم است دادهها را بین سرویسهای مختلف درون لایهی کاربردی (Application Layer) منتقل کنید. استفاده از DTO در این شرایط باعث میشود وابستگیها بین سرویسها کاهش یابد و کد تمیزتر باقی بماند.
مستقیماً از یا به Entity بدون پردازش: در این حالت استفاده از DTO توصیه نمیشود. اگر بدون فیلتر یا پردازش، مستقیماً از Entity استفاده کنید، ممکن است اطلاعاتی که نباید نمایش داده شوند (مانند رمز عبور هششده یا وضعیت حذفشده بودن) به کلاینت ارسال شوند. همچنین این کار باعث درهمتنیدگی لایههای مختلف پروژه و سختی در نگهداری کد میشود.