آبجی
14th February 2010, 12:50 AM
کمتر کسی هست که حداقل، واژه ی برنامه های چند لایه به گوشش نخورده باشه.
قبلا یک پست در این مورد در این وبلاگ نوشته بودم که فقط مفاهیم اولیه ی این تکنیک رو توضیح میداد و حال در چند پست (که البته نمی دونم چند تا میشه!) قصد دارم تا جنبه ی حرفه ای اون رو بررسی کنم و در نهایت قسمتی از یک پروژه رو با این معماری به شکلی حرفه ای و زیبا پیاده سازی کنیم.
قبل از شروع باید بگم که این تکنیک استاندارد خاصی نداره و هر کسی به روشی که دوست داره اون رو پیاده سازی می کنه. در حقیقت، تفاوت در جزئیات هست نه در کلیات.
روشی که در این چند پست می خونید، روشی هست که من ازش استفاده می کنم و این روش رو با بررسی چندین پروژه ی بزرگ و در طی چندین سال کار بر روی پروژه های مختلف انتخاب کردم. به طور کلی برنامه های چند لایه به سه بخش تقسیم میشن. لایه ی مرتبط با داده ها (DAL)، لایه ی منطقی (BLL) و لایه ی نمایش (PL)
ابتدا در مورد DAL توضیح میدم.
برای DAL نیاز به یک کلاس پایه برای تمامی کلاس های DAL دیگه وجود داره. این کلاس پایه یک کلاس abstract هست.
کلاس های abstract کلاس هایی هستند که متدها و خواص عمومی رو برای بقیه ی کلاس هایی که از اونها به ارث میبرن تعریف می کنن.
برای متدهای کلاس های abstract بر خلاف اینترفیس ها میشه کد نوشت. کد نویسی برای خواص و متدهای کلاس های abstract دلخواهه اما اعضای یک اینترفیس نمی تونن هیچگونه کدی در بدنشون داشته باشن.
درک مفهوم کلاس های abstract و interface ها برای پیاده سازی پروژه های بزرگ و چند لایه واقعا نیاز هست. بنابراین سعی کنید در مورد اونها مطالعه ی بیشتری داشته باشید.
تعداد کلاس های DAL بستگی به تعداد موجودیت ها داره. مثلا یک موجودیت مثل مشتری یک کلاس DAL مختص خودش داره. اما همین کلاس از کلاس پایه ی abstract ای که قبلا اشاره شده ارث می بره. این کلاس abstract، اعمال و خواص متداولی که برای کار با داده ها از اونها استفاده میشه رو در بر داره. به عنوان مثال، خاصیت Connection String و یا متدهای شی DbCommand که برای اجرای یک دستور SQL استفاده میشن. مثل ExecuteNonQuery و ExecuteReader و …
اگر با MS Data Application Block آشنا باشید، اون رو می تونید به عنوان همین کلاس abstract در نظر بگیرید و ازش استفاده کنید! کلاس کاملیه و بسیار خوب نوشته شده.
توضیحات فوق رو در قالب شبه کد در ذیل می بینید:
abstract class DataAccess
{
protected int ExecuteNonQuerty(DbCommand cmd)
{
// do something
return cmd.ExecuteNonQuerty();
}
}
abstract class MyDalObj: DataAccess
{
public acstract bool DeleteRecord(int id);
}
public class MySqlDalObj: MyDalObj
{
public override bool DeleteRecord(int id)
{
SqlCommand cmd = new SqlCommand(...);
int result = ExecuteNonQuery(cmd);
return (result == 1);
}
}
فراخوانی متد ExecuteNonQuery در کلاس MySqlDalObj، این متد رو از کلاس پایه ی DataAccess فراخوانی می کنه.
قبلا یک پست در این مورد در این وبلاگ نوشته بودم که فقط مفاهیم اولیه ی این تکنیک رو توضیح میداد و حال در چند پست (که البته نمی دونم چند تا میشه!) قصد دارم تا جنبه ی حرفه ای اون رو بررسی کنم و در نهایت قسمتی از یک پروژه رو با این معماری به شکلی حرفه ای و زیبا پیاده سازی کنیم.
قبل از شروع باید بگم که این تکنیک استاندارد خاصی نداره و هر کسی به روشی که دوست داره اون رو پیاده سازی می کنه. در حقیقت، تفاوت در جزئیات هست نه در کلیات.
روشی که در این چند پست می خونید، روشی هست که من ازش استفاده می کنم و این روش رو با بررسی چندین پروژه ی بزرگ و در طی چندین سال کار بر روی پروژه های مختلف انتخاب کردم. به طور کلی برنامه های چند لایه به سه بخش تقسیم میشن. لایه ی مرتبط با داده ها (DAL)، لایه ی منطقی (BLL) و لایه ی نمایش (PL)
ابتدا در مورد DAL توضیح میدم.
برای DAL نیاز به یک کلاس پایه برای تمامی کلاس های DAL دیگه وجود داره. این کلاس پایه یک کلاس abstract هست.
کلاس های abstract کلاس هایی هستند که متدها و خواص عمومی رو برای بقیه ی کلاس هایی که از اونها به ارث میبرن تعریف می کنن.
برای متدهای کلاس های abstract بر خلاف اینترفیس ها میشه کد نوشت. کد نویسی برای خواص و متدهای کلاس های abstract دلخواهه اما اعضای یک اینترفیس نمی تونن هیچگونه کدی در بدنشون داشته باشن.
درک مفهوم کلاس های abstract و interface ها برای پیاده سازی پروژه های بزرگ و چند لایه واقعا نیاز هست. بنابراین سعی کنید در مورد اونها مطالعه ی بیشتری داشته باشید.
تعداد کلاس های DAL بستگی به تعداد موجودیت ها داره. مثلا یک موجودیت مثل مشتری یک کلاس DAL مختص خودش داره. اما همین کلاس از کلاس پایه ی abstract ای که قبلا اشاره شده ارث می بره. این کلاس abstract، اعمال و خواص متداولی که برای کار با داده ها از اونها استفاده میشه رو در بر داره. به عنوان مثال، خاصیت Connection String و یا متدهای شی DbCommand که برای اجرای یک دستور SQL استفاده میشن. مثل ExecuteNonQuery و ExecuteReader و …
اگر با MS Data Application Block آشنا باشید، اون رو می تونید به عنوان همین کلاس abstract در نظر بگیرید و ازش استفاده کنید! کلاس کاملیه و بسیار خوب نوشته شده.
توضیحات فوق رو در قالب شبه کد در ذیل می بینید:
abstract class DataAccess
{
protected int ExecuteNonQuerty(DbCommand cmd)
{
// do something
return cmd.ExecuteNonQuerty();
}
}
abstract class MyDalObj: DataAccess
{
public acstract bool DeleteRecord(int id);
}
public class MySqlDalObj: MyDalObj
{
public override bool DeleteRecord(int id)
{
SqlCommand cmd = new SqlCommand(...);
int result = ExecuteNonQuery(cmd);
return (result == 1);
}
}
فراخوانی متد ExecuteNonQuery در کلاس MySqlDalObj، این متد رو از کلاس پایه ی DataAccess فراخوانی می کنه.