امیرحسین فضلیخانی
Back-End Developer (.NET)

برنامه نویسی سه لایه چیست و چه کاربردی دارد؟

بررسی برنامه نویسی سه لایه به زبان ساده : اگه مطالب وبسایت توسینسو خونده باشید قطعا دوره های طراحی بانک اطلاعاتی Sql server و تکنولوژی Ado.net رو دیدید. این دوره آموزش هم دقیقا مثل اون هاست اما با این تفاوت که فقط ساخت و اتصال دیتابیس به سی شارپ گفته نمی شه، بلکه تمرکز ما روی نحوه ی انجام این کاره. توی این سری آموزش ها از همون مفاهیم بهره گرفته میشه و پیشنهاد میکنم ابتدا سری به sql server، ado.net و oop بزنید.یکی از بهترین روش های طراحی نرم افزار، بهره گیری از معماری 3 لایه است. توی این معماری، ما 3 لایه مرتبط به هم داریم. اولین لایه همون فرم یا صفحه ی برنامه ماست.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

یعنی همون چیزی که کاربر می بینه و از طریق اون با برنامه ارتباط بر قرار می کنه. لایه دوم Business نام داره. این لایه خواسته های فرم رو به لایه ی سوم یعنی Data منتقل می کنه و لایه سوم با توجه به اطلاعات ورودی از Business با دیتابیس ارتباط بر قرار می کنه. و چیزی هم هست به نام DataObject که یکسری اطلاعات داخلش ریخته میشه.

شاید این اوایل درست متوجه نشید یا کاربردش رو درک نکنید اما یه ذره که جلو تر بریم می فهمید.اول از همه باید یه Connection بسازیم. برای این کار کلاسی به اسم Connection ایجاد کنید. برای اینکه کلاس سبک بشه همه ی using هارو پاک می کنیم و فقط دو تا using مورد نیازمون رو می نویسیم. یعنی دو تا using زیر:

using System.Data;
using System.Data.SqlClient;

حالا مثل قبل باید یه کانکشن بسازیم. سطح دسترسی اون رو باید Private قرار بدیم چون نیازی به دسترسی به اون داخل لایه های دیگه برنامه نداریم. مقدار اون رو new نمی کنیم و با null قرار می دیم. مثل زیر:

private SqlConnection SqlCon = null;

حالا باید ConnectionString رو به اون بدیم. برای به دست اووردن ConnectionString دیتابیس به پنجره ی Data Sources مراجعه می کنیم. اگه این پنجره رو ندارید از منوی بالای ویژوال استودیو، وارد View شوید و از آیتم های داخل Other Windows گزینه ی Data Sources رو انتخاب کنید تا این پنجره زیر ToolBox ظاهر بشه. حالا روی Add new database کلیک کنید. داخل پنجره ی باز شده گزینه ی Database رو انتخاب می کنیم و روی Next کلیک می کنیم. در مرحله ی بعد Dataset رو انتخاب می کنیم و به مر حله ی بعد میریم. الآن روی دکمه ی New Connection کلیک می کنیم.

به طور پیشفرض نوع دیتابیس روی Microsoft Access Database (OLEDB) تنظیم شده. اما ما با دیتابیس Sql server کار داریم. پس روی Change کلیک می کنیم و Microsoft SQL Server رو انتخاب می کنیم. این هارو توی مطالب دیگه ی سایت آی تی پرو می تونید مفصل ببینید به همین دلیل زود رد می شم و زیاد توضیح نمی دم.

توی قسمت Server name نام سروری که دیتابیسمون روش هست رو باید وارد کنیم. دیتابیس ما روی سیستم خودمونه پس عبارت localhost یا یک نقطه رو وارد می کنیم. در قسمت Connect to database اسم دیتابیسمون رو انتخاب می کنیم که برای ما DBtest هست. بعد از انتخاب دیتابیس روی Ok کلیک می کنیم. حالا دوباره پنجره ی اول که New Connection توش بود نمایش داده میشه.

روی علامت + کلیک می کنیم و ConnectionString رو کپی می کنیم.

حالا ما از طریق App.config اقدام به معرفی کانکشن استرینگ می کنیم. برای اینکه به اون فایل وارد بشیم، باید به پنجره ی Solution بریم و App.config رو باز کنیم. اوه! با کد های xml روبه شدیم. خونسردیمون رو حفظ می کنیم و تگ ConnectionStrings رو می سازیم. به صورت زیر:

  <connectionStrings>

  </connectionStrings>

داخل این تگ هر تعداد ConnectionString که بخوایم رو می تونیم قرار بدیم. ما فعلا یه دونه داریم. پس یک تگ دیگه به اسم add ایجاد می کنیم. این تگ چند تا خصوصیت داه که باید تما اونا رو تنظیم کنیم. اولیش name هست که اسم کانکشن استرینگ خودمون رو داخل قرار میدیم. می زاریمش SqlConnection. هر چیزی می تونیم قرار بدیم. جالا خاصیت دوم یعنی ConnectionString رو مقدار دهی کنیم. ما همون چیزی که ابتدا کپی کردیم رو قرار میدیم.

  <connectionStrings>
    <add name="SqlCon" connectionString="Data Source=.;Initial Catalog=DBtest;Integrated Security=True"/>
  </connectionStrings>

کل فایل App.config ما به صورت زیر شد:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="SqlCon" connectionString="Data Source=.;Initial Catalog=DBtest;Integrated Security=True"/>
  </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

حالا بر می گردیم به کلاس Connection که قبلا ساختیم. داخل این کلاس باید یک بار Connection رو باز کنیم بعد ببندیم. اما این دو تا کار باید جدا گونه باشه. چون ابتدا باید باز کنیم و کامند یا آداپتور رو به اون متصل کنیم و در آخر ببندیمش. بنابراین نیاز به دو تا متد داریم تا بتونیم جداگونه به باز و بسته کردنش دسترسی داشته باشیم.

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

public SqlConnection OpenSqlCon()
{

}

برای اینکه ConnectionString رو بدیم به کانشکشن خودمون، باید بهش آدرس اون رو داخل فایل App.config بدیم. ابتدا یک متغیر از نوع رشته یا string تعریف می کنیم. مقدارش رو قراره همون کانکشن استرینگ تعریف شده بدیم. پس نیاز به یک رفرنس جدید داریم که پیشفرض داخل برنامه اضافه نشده.

بنابراین از طریق منوی Solution، روی قسمت Refereces کلیک راست می کنیم و روی Add Reference کلیک می کنیم. داخل پنجره ی باز شده عبارت Configuration رو جست و جو می کنیم و رفرنس نمایش داده شده رو تیک می زنیم و اوکی می کنیم تا اضافه شه. حالا میریم سراغ استرینگمون و اسمش رو StrCon میزاریم. بعد برای معرفی ConnectionString عبارت زیر رو جلوش قرار میدیم:

System.Configuration.ConfigurationManager.ConnectionStrings["SqlCon"].ConnectionString;

به جای کلمه ی SqlCon که داخل دابل کوتیشن قرار داره می تونیم اسم هر ConnectionString دیگه که داخل App.config تعریف کردیم رو قرار بدیم. الآن استرینگ StrCon برابر شده با ConnectionString شده. حالا اون کانکشنی که قبلا ساختیم رو new می کنیم و StrCon رو بهش میدیم.

SqlCon = new SqlConnection(StrCon);

حالا اون رو باز می کنیم و return می کنیم. مثل زیر:

public SqlConnection OpenSqlCon()
{
    string StrCon = System.Configuration.ConfigurationManager.ConnectionStrings["SqlCon"].ConnectionString;
    SqlCon = new SqlConnection(StrCon);
    SqlCon.Open();
    return SqlCon;
}

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

public void CloseSqlCon()
{
    if (SqlCon != null)
    {
        if (SqlCon.State == ConnectionState.Open)
        {
            SqlCon.Close();
        }
    }
}

الآن با فراخوانی متد OpenSqlCon از هر جای برنامه می تونیم اون رو باز کنیم و در آخر هر با CloseSqlCon اون رو ببندیم. ادامه آموزش رو در جلسات بعدی دنبال کنید. توی جلسه ی قبل یک Connection ایجاد کردیم. برای اینکه بین فرم برنامه و لایه ی دوم که Business هست ارتباط بر قرار بشه و اطلاعات بین اون ها جا به جا بشه به چیزی نیاز داریم به نام Data Object. برای ایجاد دیتا آبجکت نیز ابتدا باید یک کلاس بسازیم.

داخل این کلاس متد خاصی قرار نمی دهیم و به هیچ کدام از using ها هم نیاز نداریم. فقط باید چند متغیر public بنویسیم. زمانی که دیتابیس رو درست کردیم، داخل جدولمون چند تا کالن داشتیم مثلا داخل جدول Student که اطلاعات دانش آموزان داخلش ذخیره میشه ID و FirstName و LastName را داریم.

اما با آیدی کاری نداریم و داخل دیتابیس اون رو identity specification می کنیم تا درگیر مقدار دهیش نشیم. پس باید به FirstName و LastName مقدار بدیم. برای همین دو متغیر Public از نوع String داخل Data Object تعریف می کنیم. حالا نام و نام خانوادگی دانش آموز از فرم داخل دیتا آبجکت ذخیره می شه. به صورت زیر:

DataObject Dob = new DataObject ();
Dob.FirstName = "Amir Hossein";
Dob.LastName= "Fazlikhani";

می تونیم به جای مقادیر داخل دابل کوتیشن، اون ها رو از کاربر دریافت کنیم یعنی دو تا TextBox بزاریم و مقادیر رو از Text اون ها بگیریم. حالا اطلاعات رفت به دیتا آبجکت. می رسیم به نحوه ی ذخیره ی اون ها داخل دیتابیس. اول از همه نیاز به یه پروسیجر داریم تا با اجرا کردنش مقادیر رو بگیره و Insert کنه داخل جدول دیتابیسمون. نحوه ی ساختن پروسیجر رو توضیح نمی دم چون داخل همین سایت آی تی پرو می تونید به آموزش های Sql server دسترسی داشته باشید. پروسیجرمون بدین صورت شد:

create procedure AddStudent
        @firstname nvarchar(50),
        @lastname nvarchar(50)
as
        insert into Student (FirstName, LastName)
        values (@firstname, @lastname)

حالا میریم سراغ لایه ی سوم یعنی Data Layer. این لایه وظیفه ی ذخیره ی اطلاعات دریافتی از لایه ی Business در دیتابیس رو داره. Business هم که لایه ی دومه اطلاعاتش رو از Data Object دریافت می کنه. اول باید Data Layer رو بنویسیم. برای این کار یک کلاس می سازیم به اسم DataLayer. داخل این کلاس همه ی using هارو پاک می کنیم و فقط دو using زیر رو قرار میدیم:

using System.Data;
using System.Data.SqlClient;

حالا باید برای هر کدوم از کار هامون مثلا Insert و Update و ... یک متد بنویسیم. من فقط Insert رو میگم و با یاد گرفتن اون میتونید بقیش رو هم بنویسید که بیش ترین تفاوت رو توی پروسیجر هاشون دارن و داخل Ado.net فرق چندانی ندارن. پروسیجری که نوشتیم باید دو مقدار firstname و lastname رو دریافت کنه تا بتونه یک خط جدید داخل جدول Insert کنه. پس متد InsertData که ساختیم باید این دو مقدار رو دریافت کنه و تحویل پروسیجر بده. این کار رو داخل دوره های برنامه نویسی شی گرا یا به اختصار oop یاد گرفتید. پس من فقط کدش رو قرار می دم تا ساختارش رو ببینید و گیج نشید.

public void InsertData(string FirstName, string LastName)
{

}

حالا باید طبق چیزایی که توی دوره های Ado.net یاد گرفتید پروسیجر AddStudent رو فرا خوانی کنیم و مقادیر مورد نیاز رو بهش بدیم. اول یه نمونه از روی کلاس DBConnection که توی جلسه ی قبل ساختیم و برای ایجاد و باز کردن Connection بود بسازیم. مثل زیر:

DBConnection SqlCon = new DBConnection();

حالا یه SqlCommand می نویسیم تا پروسیجر رو اجرا کنیم. بعد از این کار Connection اون رو باید برابر با متد OpenSqlCon که برای باز کردن Connection بود قرار بدیم. بصورت زیر:

Sqlcmd.Connection = SqlCon.OpenSqlCon();

بعد از این کار، باید به کامند خودمون بگیم که می خوایم یه پروسیجر رو اجرا کنیم. بنابراین مثل زیر عمل می کنیم:

Sqlcmd.CommandType = CommandType.StoredProcedure;

بعد از اون باید پروسیجر AddStudent رو به اون معرفی کنیم. مقدار CommandText اون رو برابر با اسم پروسیجر می کنیم. یعنی:

Sqlcmd.CommandText = "InsertStudent";

حالا باید مقادیر مورد نیاز رو بهش بدیم. یعنی پارامتر ها رو اضافه کنیم. دو پارامتر FirstName و LastName. به جای از Add استفاده کنیم و مجبور بشیم نوع پارامتر رو هم بنویسیم از AddWithValue استفاده می کنیم که مقدار رو بهش بدیم و خودش تشخیص بده نوعش چیه. مثل زیر که هر دو پارامتر اضافه شدن:

Sqlcmd.Parameters.AddWithValue("@firstname",FirstName);
Sqlcmd.Parameters.AddWithValue("@lastname",LastName);

حالا کامند رو اجرا می کنیم و با استفاده از متد CloseSqlCon که برای بستن Connection بود و توی جلسه ی قبل نوشتیم Connection خودمون رو می بندیم. دقیقا مثل این کد:

Sqlcmd.ExecuteNonQuery();
SqlCon.CloseSqlCon();

کارمون توی لایه ی سوم تموم شده. س میریم سراغ لایه ی میانی که Business بود. توی این لایه همون طور که گفته شد اطلاعات از Data Object دریافت میشه و به لایه ی سوم فرستاده میشه. پس ابتدا کلاس Business رو می سازیم و یه متد می نویسیم به نام Insert که DataObject رو دریافت کنه.

public void Insert(DataObject  dob)
{

}

حالا باید یه نمونه از لایه ی سوم یعنی DataLayer ایجاد کنیم.

DataLayer dl=new DataLayer();

و در آخر هم دو مقدار FirstName و LastName دیتا آبجکت رو به متد InsertData واقع در لایه ی سوم بدیم تا پروسیجر این مقادیر رو دریافت کنه و دانش آموز رو به دیتابیس اضافه کنه. مثل زیر:

dl.InsertData(dob.firstname, dob.lastname);

کل این متد که در لایه ی دوم واقع شده به صورت زیر شد:

public void Insert(DataObject  dob)
{
    DataLayer dl = new DataLayer();
    dl.InsertData(dob.firstname, dob.lastname);
}

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

Business b = new Business();
b.Insert(Dob);

به صورت کلی:

DataObject Dob = new DataObject();
Dob.FirstName = "Amir Hossein";
Dob.LastName = "Fazlikhani";
Business b = new Business();
b.Insert(Dob);

برنامه نویسی 3 لایه به صورت ساده اینگونه بود. در آینده با یک فیلم آموزشی پروژه محور به صورت گسترده تر توضیح میدم.


نظرات