در ASP.NET MVC آیا ViewModel همان DTO است؟
معماران نرم افزار بدنبال راه حلی برای توسعه یک پروژه به صورت تیمی هستند بطوریکه هر شخص بروی لایه ای از پروژه تمرکز کند و بدون وابستگی به دیگر افراد (یا لایه‌های دیگر پروژه) بتواند فعالیت خود را تکمیل کند.
برای این منظور خیلی از برنامه نویسان (مخصوصاً DDD کارها) از لایه ای با عنوان DTO استفاده می‌کنند. وظیفه‌ی این لایه انتقال اطلاعات اشیاء بدون هیچ پیچیدگی و بدون در نظر گرفتن رفتار آن اشیاء بین لایه‌ها است. درواقع ادبیات مشترک لایه سرویس و لایه ارائه را می‌توان مهمترین کاربرد DTO دانست.
برای مثال زمانیکه معماری شما سرویس محور طراحی شده است بسیار معقولانه است که به جای ارسال و دریافت Entity ها به یا از سرویس ها، از EntityDTO استفاده کنید.
اگر با MVVM آشنایی داشته باشید حتماً متوجه شباهت زیاد ViewModel با DTO شده اید.
البته می‌دانیم که ViewModel در WPF شامل رفتار اشیاء هم می‌تواند باشد اما DTO به هیچ عنوان دربرگیرنده رفتار اشیاء نیست.
حال سوال اساسی اینست که در ASP.NET MVC نیازی به استفاده از DTO و ViewModel در کنار یکدیگر است؟ این موضوع یعنی یک استفاده مجدد از AutoMapper جهت نگاشت این دولایه. آیا این موضوع را ضروری می‌بینید؟
یا اینکه شما از DTO و ViewModel به عنوان یک لایه استفاده می‌کنید و به قولی DTO را برابر ViewModel می‌دانید؟ 
  • بله
  • خیر
  • تاریخ انقضاء‫۱۱ سال و ۲ ماه قبل، دوشنبه ۳۱ تیر ۱۳۹۲، ساعت ۰۴:۳۱

نتایج نظر سنجی

خیر
۵۷.۶ %
با ۱۹ رای
بله
۴۲.۴ %
با ۱۴ رای
  • #
    ‫۱۱ سال و ۴ ماه قبل، جمعه ۱۷ خرداد ۱۳۹۲، ساعت ۱۴:۵۸
    اگر با MVVM آشنایی داشته باشید حتماً متوجه شباهت زیاد ViewModel با DTO شده اید.
    البته می‌دانیم که ViewModel در WPF شامل رفتار اشیاء هم می‌تواند باشد اما DTO به هیچ عنوان دربرگیرنده رفتار اشیاء نیست.
    به نظرم DTO بیشتر از اینکه به ViewModel شبیه باشد به Model در MVVM شبیه است.
    Model در MVVM را می‌تواند معادلی برای ViewModel در MVC قرار داد و ViewModel در MVVM را می‌توان شبیه Controller در MVC در نظر گرفت.
    به نظر من تفاوتی که DTO با ViewModel دارد این است =>
    کلاس StudentService نیاز به اطلاعات موجودیت Teacher از جمله نام و شماره شناسنامه دارد . در نتیجه باید متدی در TeacherService فراهم شود که این اطلاعات را تامین کند :

    public class TeacherService
    {
         internal  IEnumerable<TeacherDto> GetTeachers ()
          {
               return ...
          }
    }

    چون متد بالا قرار نیست اطلاعاتی را به لایه‌ی نمایش پاس دهد و اطلاعات مستقیما در یک متد سرویس استفاده می‌شود خروجی آن Dto تعیین شده.
    به نظر من این قواعد وحی منزل نیست ، به عنوان مثال شاید شخصی در طراحی خود از DTO‌ها به عنوان اعضای ViewModel‌ها استفاده کند یا DTO را به Presentation layer برگرداند و آن را به ViewModel نگاشت کند.
    اما در نهایت پاسخ من به این نظرسنجی گزینه‌ی خیر است.