معماری سه لایه چیست؟

در معماری سه لایه تمام برنامه به چندین بخش تقسیم می شود. این بخش ها می توانند فیزیکی یا منطقی باشند. هر بخش کار خاصی را انجام می دهد مثلا نمایش اینترفیس کاربر یا دسترسی به داده ها. برنامه می تواند به هر تعداد لایه داشته باشد ولی به هر حال بیشتر برنامه ها سه لایه مجزا دارند که عبارتند از :

  • Presentation Layer
  • Business Logic Layer
  • Data Access Layer

همان طور که احتمالا حدس زده اید، لایه Presentation چیزی نیست به جز بخشی از نرم افزار که با کاربر برنامه شما ارتباط برقرار می کند ( اینترفیس برنامه شماست ) نمایش داده ها به کاربر نهایی و اجازه به آنان برای ارتباط داشتن با داده ها، اصلی ترین وظیفه این لایه است. در بیشتر موارد داده هایی که توسط کاربر وارد می شوند نیاز به اعتبارسنجی یا پردازش اضافی دارند. این مسوولیت لایه Business Logic است. در نهایت داده های برنامه شما نیاز به ذخیره و بازیابی از طریق یک انبار داده دارند ( مثلا سیستم مدیریت دیتابیس های رابطه ای یا RDBMS و یا XML , .. ) این وظیفه توسط لایه دسترسی به داده انجام می شود. به طور خلاصه، فرآیند مورد نظر ما این گونه کار می کند:

  • کاربر برای داده های برنامه درخواستی ارسال می کند.
  • لایه Data Access داده های مورد نظر را بازیابی می کند و از طریق لایه Business Logic آن ها را به لایه نمایش می فرستد.بعضی مواقع لایه دسترسی به داده ها، این داده ها را مستقیما به لایه نمایش ارسال می کند.
  • لایه نمایش اطلاعاتی که باید نمایش داده شوند را از طریق لایه Business Logic دریافت می کند.
  • کاربر داده ها را تغییر می دهد و عمل مناسب در مورد آن ها را اجرا می کند ( مثل اضافه یا به روز کردن داده ها )
  • لایه Business Logic صحت داده های وارد شده توسط کاربر را بررسی می کند ( داده ها را اعتبار سنجی می کند)
  • اگر داده ها معتبر باشند آن ها را برای به روز رسانی در بانک اطلاعاتی به دست لایه دسترسی به داده می سپارد.

 

مزیت های برنامه های چند لایه

  • برنامه ها به چند بخش منطقی جدا از هم تقسیم می شوند و اتصال میان UI ( رابط کاربری ) ، پردازش ها و بانک اطلاعاتی کم می شود.
  • تغییر در بانک اطلاعاتی یا روال های دسترسی به داده ها تاثیری در لایه نمایش یا برنامه کلاینت نخواهد گذاشت.
  • برنامه کلاینت با عبارات SQL آمیخته نخواهد شد.
  • نام جداول و ستون ها به طور موثری از برنامه کلاینت حذف می شوند.
  • برنامه کلاینت نمی فهمد که داده ها از کجا آمده اند ( چیزی که به آن location transparency گفته می شود )
  • تغییر یا گسترش برنامه بسیار ساده تر خواهد شد، بدون نیاز به تغییر یا کامپایل مجدد برنامه کلاینت.

نکته منفی در معماری سه لایه این است که شما باید تعداد زیادی بخش ها و کلاس های از هم جدا در نرم افزار بسازید. اما به هر حال مزایای این روش بیشتر و برتر از معایب آن است.

 

انتخاب های لایه Presentation

دو انتخاب اصلی برای ساخت یک لایه نمایش در دات نت وجود دارد. آنها فرم های ویندوزی یا فرم های وبی ASP.NET هستند. با استفاده از ویندوز فرم ها شما می توانید برنامه های دسکتاپ فرم محور ( form base ) معمول را بسازید. برنامه های ویندوز فرمی می توانند المان های رابط کاربری بسیار غنی به کاربر پیشنهاد کنند.آن ها کم و بیش شبیه به فرم های ویژوال بیسیک هستند. جذاب ترین گزینه برای توسعه لایه نمایش استفاده از وب فرم های ASP.NET است. کنترل هایی مثل دیتاگرید، دیتالیست و تقویم ( Calendar ) یک رابط کاربری قدرتمند را با مقدار کمی کد فراهم می کنند. انتخاب هایی که در بالا برای ساخت یک لایه نمایش بررسی کردیم می توانند توسط زبان های مختلفی مثل سی شارپ یا ویژوال بیسیک دات نت پیاده سازی شوند.

 

انتخاب های لایه Business Logic

لایه Business logic از چندین بخش که کارهایی نظیر اعتبار سنجی کار، گردش کار یا کارهای مشابه را انجام می دهند تشکیل شده است. کامپوننت های دات نت این لایه را شکل می دهند.

 

انتخاب های لایه Data Access

این لایه با دستکاری داده ها مثل اضافه ، حذف و به روز رسانی آن ها سر و کار دارد. داده هایی که به آن ها اشاره کردیم می توانند در RDBMS یا XML قرار داشته باشند. شما باید لایه دسترسی به داده را چنان طراحی کنید که دیگر لایه ها نیازی به دانستن وضعیت انبار داده ها نداشته باشند. ADO.NET فناوری دسترسی به داده تحت دات نت است. اگر چه ADO.NET از طریق کلاس های DataReader اجازه دسترسی به داده های در هنگام اتصال را می دهد ولی بیشترین تمرکز روی دسترسی به داده ها در زمان متصل نبودن است. دیتاست نقش کلیدی را در این مورد بازی می کند. در بعضی موارد شما می توانید ADO را هم برای دسترسی به داده ها استفاده کنید ولی استفاده از آن باید دلیل معتبری داشته باشد. از ADO استفاده نکنید فقط به خاطر اینکه RecordSet ها را دوست دارید. این جا هم کامپوننت های دات نت لایه را تشکیل می دهند. همچنین وب سرویس ها هم می توانند لایه دسترسی به داده را شکل دهند. این مخصوصا زمانی درست است که دیتابیس شما فراهم کننده ( provider ) داده ندارد. در این گونه موارد شما می توانید مقداری کد برای اتصال به داده ها و پر کردن دیتاست ها و بازگرداندن نتایج درون دیتاست به درخواست کننده داده بنویسید. علاوه بر ADO.NET شما می توانید از امکانات سیستم مدیریت دیتابیس خود مثل توابع و یا روال های ذخیره شده ( Stored Procedures ) استفاده کنید. در این سری آموزشی قصد داریم در قالب یک پروژه عملی این معماری را به شما آموزش دهیم.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. مصطفی پاسخ دادن

    تشکر فراوان

    • Developer0400 پاسخ دادن

      خواهش می کنم دوست خوبم ، لطفا سایت مارو به دوستانتون معرفی کنید .
      سپساگزارم

  2. میثم پاسخ دادن

    سلام سایت شما واقعا عالی هست.
    از شما بسیار ممنونم.
    اجرکم عند الله.

  3. صبا پاسخ دادن

    واقعا عالی بود. خیلی وقت بود دنبال این مطلب بودم. ادامه بدید حتما

  4. محمدحسین پاسخ دادن

    سلام
    در برنامه نویسی سه لایه برای ویندوز همون طور که می دونیم لایه نمایش هیچ شناختی ازلایه اول یعنی DAL نداره
    این رو در نظر بگیرید :
    ۱٫ DAL
    ۲٫ BLL
    ۳٫PAL – یا PL و یا UI
    حالا متدی داریم که مقداری رو از یک جدول بر می گردونه ، این متد با بانک اطلاعاتی در ارتباط هست بنابراین در DAL به این صورت پیاده میشه :
    public Table1 find (int code) { … }
    فرض می کنیم با دستورات LINQ مقداری رو بر اساس کد برگردوندیم در BLL از این متد استفاده و رفرنس مربوط به لایه DAL رو هم Add می کنیم
    public Table1 find (int code) { DAL obj =new DAL(); return obj.find(code); }
    حالا از این موارد که می تونیم در این قسمت try catch بذاریم و … صرف نظر می کنیم تا به سوالم برسیم

    سوال :
    در حال حاضر من لایه های
    DAL
    و BLL
    رو با تابع مورد نظرم درست کردم و خطایی هم ندارم ، اما اگر بخوام در Ui از متد ایجاد شده در لایه BLL (با نام find) استفاده کنم خطایی رو به این صورت میبینم:
    که اشاره شده این متد رفرنسی از DAL داره ، بایستی در این لایه (یعنی Ui) لایه DAL رو هم اضافه کنی.

    من اگر اضافه کنم برنامه جواب می ده.
    اما اینطوری داریم اصل سه لایه رو نقض می کنیم چون داریم میگیم لایه UI هیچ شناختی از لایه DAL نداره ، وقتی اینکار رو می کنیم عملاً شناخت کامل داره
    و حتی می تونه بدون دخالت BLL هم متدها رو از DAL فراخوانی کنه؟

    چه طوری می تونم متدی رو
    در DAL ایجاد کنم ( خروجی یک جدول )
    در BLL استفاده کنم و منطق خاص خودم رو پیاده کنم
    و در UI فقط از BLL استفاده کنم
    ؟

    • یونس ابراهیمی پاسخ دادن

      سلام دوست عزیز، ممنون میشم سوالتونو توی بخش پرسش و پاسخ مطرح بفرمایید

  5. فاطمه پاسخ دادن

    ممنون خیلی خوب بود

    • یونس ابراهیمی پاسخ دادن

      خواهش می کنم، لطف دارین

  6. سعید پاسخ دادن

    ببخشید میشه یک مثال هم بزارید ممنون میشم

    • یونس ابراهیمی پاسخ دادن

      سلام، ادامه مطالب یا پست های بعدی رو بخونید، مثال زدم