PDA

View Full Version : گفتگو: برنامه نویسی سه لایه



ostovarit
دوشنبه 15 آذر 1389, 21:54 عصر
شروع به خوندن و انجام یک پروژه در مورد برنامه نویسی سه لایه کردم یک سری مقاله که به نظرم مناسب میاد اینجا گذاشتم تا دوستان دیگه هم که میخوان این بحث رو شروع کنن ابتدا این مقاله ها رو مطالعه کنن ...
در طول این تاپیک مقالات، برنامه ها و لینک های مرتبط با برنامه نویسی سه لایه ارائه میشه ...
و همچنین سوالات خودم و دیگر دوستان درباره این موضوع مطرح خواهد شد ...

برای شروع لینک های زیر مناسبه:

http://www.nofa.ir/NewsBody-ID104.aspx یک مقاله فارسی
http://barnamenevis.org/showthread.php?78333-مقاله-برنامه-چندلایه-چیست-؟ (http://barnamenevis.org/showthread.php?78333-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DA%86%D9%86%D8%AF%D9%84%D8%A7%DB%8C%D9%87-%DA%86%DB%8C%D8%B3%D8%AA-%D8%9F) از تاپیک های همین فروم
http://www.codeproject.com/KB/architecture/three_tier_architecture.aspx متن لاتین و یک نمونه برنامه که تمام لایه ها رد یک پروژه به صورت کلاس تعریف شده
http://www.codedigest.com/Articles/ASPNET/187_How_to_create_a_website_using_3_tier_architect ure.aspx یک نمونه که هر لایه در یک پروژه تعریف شده
http://www.how2learnasp.net/article.aspx?code=88407883-053c-4035-88c8-b75d804d6e2c متن فارسی همراه با یک مثال
http://www.codedigest.com/Articles/A...hitecture.aspx (http://www.codedigest.com/Articles/ASPNET/187_How_to_create_a_website_using_3_tier_architect ure.aspx) آموزش ساخت یک وب سایت با برنامه نویسی سه لایه

سوالات :

- هر لایه باید در پروژه های جدا گونه نوشته بشه و dll های حاصل در پروژه اصلی اضافه بشه یا مثل مثال کد پروجکت هر لایه باید داخل یک کلاس و تحت یک پروژه واحد تعریف بشه ... برای این موضوع قانونی وجود داره یا دل بخواهیه؟


برای پروژه های خیلی کوچک این کار رو میشه کرد و مشکلی هم پیش نمیاد اما برای پروژه ها بزرگ که هر لایه متشکل از دهها یا شایدم صدها کلاس هست این کار به هیچ وجه امکان پذیر نیست و من هر چی پروژه بزرگ و درست و حسابی ( در محیط VS) دیدم همشون از Class Library استفاده کرده بودند . ( من هم توصیه می کنم حتی برای پروژه های کوچک از Class Library استفاده کنید )



- یکی از دوستان در پستی گفته بود: 3Layer programing با 3tire programing فرق داره ... فرقشون چیه؟


3tire programing جدا سازی لایه های پروژه به صورت فیزیکی هست که این لایه ها می تونند همشون در یک کامپیوتر ( سرور ) باشند یا در کامپیوتر ( سرور ) های جداگانه . این روش بیشتر در پروژه های خیلی بزرگ استفاده میشه که مثلا یک سرور رو فقط برای سرویس دهی لایه DAL (مثلا) قرار میدهند .
3Layer programing جدا سازی لایه های پروژه از لحاظ منطقی هست که منظور ما در اینجا از لایه بندی همینه و معمولا برای استفاده از لایه ها از DLL ها اونها استفاده میشه .


- آیا استفاده از برنامه نویسی سه لایه در تمامی پروژه ها امکان پذیر و صحیح است؟ اگر پاسخ شما منفی است در چه پروژه هایی باید استفاده شود؟ و به چه دلیل؟

برنامه نویسی سه لایه برای هر نوع برنامه نویسی (یعنی هر پروژه ای!) به درد نمیخوره ... چرا ؟ چون که همان طور که میدونید برنامه نویسی سه لایه از معایبش اینه که Performance برنامه رو پایین میاره ( به علت ارتباط زیاد بین لایه ها ) و برای برنامه هایی که Performance در اولویت هستن مسلما آنچنان مفید نخواهد بود ... یا در برنامه هایی که لایه کاربری بسیار اهمیت داره نیز مناسب نمی باشند ...


- طبق مطلبی که در یکی از مقاله های فوق نوشته شده بود یک لایه به نام CashLayer بین GUI و BLL قرار میگیره ( اجباری نیست) که حاوی اطلاعاتی هست که ثابت هستن تا نیازی نباشه تمامی اطلاعات از دیتابیس سلکت زده بشه ... این لایه فقط در پروژه های وب هست یا در پروژه های ویندوزی هم استفاده داره؟ اگر استفاده داره یک نمونه مثال بزنید؟و این اطلاعات چه چیزایی میتونه باشه؟

برنامه نویسی لایه ای دارای استاندارد خاصی نیست و یه قرار داد هست که شما اگر رعایتش کنید یکسری مزایا برای برنامتون داره ، اون لایه Cache Layer ( نه Chash Layer ) هم به همین منوال هست و میتونه تو پروژه های ویندوزی هم کاربرد داشته باشه ، مثلا فرض کنید یه برنامه برای یه آژانس هواپیمایی نوشتید و چند کاربر تحت شبکه محلی باهاش کار میکنن ، هر روز تعرفه بلیط ها تغییر پیدا میکنه ، برنامه های کاربران برای صادر کردن هریک بلیط باید به بانک سرور مراجعه کنه و ازش درخواست تعرفه امروز اون بلیط رو بده ، حالا فکر کن 10 تا کاربر در روز بخوان 100 تا بلیط صادر کنن ، میشه 1000 بار مراجعه به سرور برای گرفتن یک تعرفه که تو اون روز ثابت هست ، با اضافه کردن لایه Chache Layer برنامه های کلاینت میتونن اول صبح که شروع به کار میکنن یک بار تعرفه های رو از رو سرور بخونن و و تو لایه Chache Layer خودشون نگه داری کنن و هر بار برای صدور بلیط به Cache Layer مراجعه کنن نه سرور و اگر هم وسط روز تعرفه ای تغییر پیدا کرد سرور به کلاینت ها خبر میده و Cache Layer با تعرفه های جدید به روز رسانی میشه ، با این شیوه سرعت برنامه افزایش و بار روی شبکه کاهش پیدا میکنه . این ساده ترین سناریویی بود که میشد برای Chache Layer تو برنامه های Windows Base در نظر گرفت .



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

نسخه یک ----------------------------
ابتدا اومدم یک پروژه جدید WinForm ایجاد کردم (لایه GUI) و بعد دو ClassLibrary به نام های BLL به پروژم اضافه کردم دیتابیس و یک جدول به نام CustomerReg برای ذخیره داده ساختم ...
در لایه DAL کلاسی به نام myConnection ایجاد کردم و در هر بار اتصال به دیتابیس اون کلاس رو خوندم ارتباط رو Open و بعد Close کردم...
در کلاس SQLActivity متد های کار با پایگاه داده رو پیاده سازی کردم و بعد یک کلاس برای جدول CustomerReg درست کردم و داخلش متدهای مربوط به insert , update , delete , search رو پیاده کردم که هر کدوم از این متد ها اشاره به Stored Procedures مربوط به خود دارند ...
کارم اینجا با لایه DAL تموم میشه و میرم سراغ لایه BLL ابتدا با AddRefrence لایه DAL رو به این لایه اضافه میکنم و بعد متد هایی رو برای عملیات های insert , update delete , search و... تعریف کرده و بعد از اعتبار سنجی داده ها متد های ساخته شده در لایه DAL رو فراخوانی میکنم اینجا هم دیگه کاری نداریم ...
لایه آخر(GUI) بعد از طراحی لایه BLL رو AddRefrence میکنم و در باتن ها و تکست باکس ها کد های مربوطه رو وارد میکنم و متدهای تعریف شده در BLL رو استفاده و پارامتر های مورد نیاز رو set میکنم.

نسخه دوم ----------------------------
صمیمانه از دوستانی که در این تاپیک شرکت میکنن و نظراتشون رو میدن تشکر دارم در نسخه دوم برخی از مشکلاتی که دوستان گفته بودند رفع شد:
یک سری پراپرتی تعریف کرده بودم که استفاده نشده بود این مورد رفع شد و مقادیر از طریق پراپرتی ها ارسال و دریافت شد...
مشکلی در ویرایش بود، به اشتباه خطای تکراری بودن نام رو میداد که رفع شد
برای اعتبار سنجی مقادیر وارد شده در ایمیل و شماره همراه کلاسی در لایه BLL اضافه شد که این کار رو انجام میده ...
و برای ورود اطلاعات برای هر تکست باکس سمپل هایی رو گذاشتم داخل هر کدوم ...

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

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

shima2006
دوشنبه 15 آذر 1389, 23:10 عصر
سلام دوستان
با تشکر از دوست خوبمونOstovarit به خاطر این تاپیک مفید
یه مثال و یه لینک دیگه هم هست که من خیلی ازشون استفاده کردم:
http://www.codedigest.com/Articles/ASPNET/187_How_to_create_a_website_using_3_tier_architect ure.aspx
PhotoGalleryCS.zip (http://www.c-sharpcorner.com/Forums/UploadFile/vendettamit/05082010233104PM/PhotoGalleryCS.zip) منبع : http://www.c-sharpcorner.com/Forums/ShowMessages.aspx?ThreadID=85645

sayan
دوشنبه 15 آذر 1389, 23:47 عصر
سلام دوست خوبم.

جواب سوال 2:
------------------
معماری 3 لایه رو میتوان به صورت سه پروژه مجزا تعریف کرد یا اینکه به صورت سه کلاس در یک پروژه.
دلیل اینکه در 3 پروژه جدا تعریف میکنن اینه که هر لایه ای رو که میخواهیم در لایه دیگه استفاده کنیم باید رفرنس بدیم تا از محتویات اون لایه بتونیم استفاده کنیم. اینجوری منطق برنامه درست تر و کاربر هم رفرنس های اشتباه نمی ده و فقط اون لایه ای که حق دسترسی به لایه دیگه رو داره میتونه ازش استفاده کنه ولی اگه بصورت کلاس توی یک پروژه باشه چون Namespace سه کلاس یکی همش یکجا هست و منطق 3 لایه نویسی احیاناً دچار خطا بشه.
نمیدونم واضح گفتم یا پیچیده تر کردم

سوال 2-
-------------
منظور هر دو معماری 3 لایه هست . فرقی با هم ندارند.

mmd2009
سه شنبه 16 آذر 1389, 02:01 صبح
با سلام.

البته مطمئنا به 2 کلاس و لایه کاربری برنامه لایه ای نمیگن این یعنی منطق لایه ای رو به سخره کشیدن.

موفق باشید

cjNet
سه شنبه 16 آذر 1389, 10:18 صبح
با سلام .


- هر لایه باید در پروژه های جدا گونه نوشته بشه و dll های حاصل در پروژه اصلی اضافه بشه یا مثل مثال کد پروجکت هر لایه باید داخل یک کلاس و تحت یک پروژه واحد تعریف بشه ... برای این موضوع قانونی وجود داره یا دل بخواهیه؟
من خودم پروژه هایی رو که می نویسم ، اول پروژه ام رو ایجاد می کنم و بعد به ازای هر لایه یک Class Library به پروژه ام اضافه می کنم . در واقع هر لایه مجموعه ای از کلاسها هست و Class Library بهترین روش ( به نظر من ) برای پیاده سازی این منطق هست .
در روشی که من استفاده می کنم : یک پروژه بیشتر ندارم و لایه ها ( Class Library ) رو در همون پروژه ایجاد می کنم . البته هر Class Library می تونه یک پروژه مستقل باشه ولی من برای راحتی مدیریت پروژه هام Class Libraryها رو در همون پروژه اصلی ایجاد میکنم .


هر لایه باید داخل یک کلاس و تحت یک پروژه واحد تعریف بشه ... برای این موضوع قانونی وجود داره یا دل بخواهیه؟
ببین منطقا" کار درستی ولی از لحاظ عقلی نه ( به نظر من ) .
برای پروژه های خیلی کوچک این کار رو میشه کرد و مشکلی هم پیش نمیاد اما برای پروژه ها بزرگ که هر لایه متشکل از دهها یا شایدم صدها کلاس هست این کار به هیچ وجه امکان پذیر نیست و من هر چی پروژه بزرگ و درست و حسابی ( در محیط VS) دیدم همشون از Class Library استفاده کرده بودند . ( من هم توصیه می کنم حتی برای پروژه های کوچک از Class Library استفاده کنید )


- یکی از دوستان در پستی گفته بود: 3Layer programing با 3tire programing فرق داره ... فرقشون چیه؟
3tire programing جدا سازی لایه های پروژه به صورت فیزیکی هست که این لایه ها می تونند همشون در یک کامپیوتر ( سرور ) باشند یا در کامپیوتر ( سرور ) های جداگانه . این روش بیشتر در پروژه های خیلی بزرگ استفاده میشه که مثلا یک سرور رو فقط برای سرویس دهی لایه DAL (مثلا) قرار میدهند .

3Layer programing جدا سازی لایه های پروژه از لحاظ منطقی هست که منظور ما در اینجا از لایه بندی همینه و معمولا برای استفاده از لایه ها از DLL ها اونها استفاده میشه .

امیدوارم مفید باشه ...

ostovarit
سه شنبه 16 آذر 1389, 12:00 عصر
با تشکر از دوستانی که در بحث شرکت کردند ...

طبق مطلبی که در یکی از مقاله های فوق نوشته شده بود: http://www.how2learnasp.net/article.aspx?code=88407883-053c-4035-88c8-b75d804d6e2c یک لایه به نام CashLayer بین GUI و BLL قرار میگیره ( اجباری نیست ) که حاوی اطلاعاتی هست که ثابت هستن تا نیازی نباشه تمامی اطلاعات از دیتابیس سلکت زده بشه ... این لایه فقط در پروژه های وب هست یا در پروژه های ویندوزی هم استفاده داره؟ اگر استفاده داره یک نمونه مثال بزنید؟ و این اطلاعات چه چیزایی میتونه باشه؟

5mmmmm
چهارشنبه 17 آذر 1389, 12:56 عصر
برنامه نویسی 3 لایه خوبه ولی یه جاهایی دستا پاگیر میشه!یه جاهایی اگه همه کارها را باهم یکجا انجام بدی بجای اینکه بخواهی تفکیکش کنی مناسب تره و پیچیدگی کمتری داره!

ostovarit
چهارشنبه 17 آذر 1389, 13:02 عصر
برنامه نویسی 3 لایه خوبه ولی یه جاهایی دستا پاگیر میشه!یه جاهایی اگه همه کارها را باهم یکجا انجام بدی بجای اینکه بخواهی تفکیکش کنی مناسب تره و پیچیدگی کمتری داره!

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

amir-yeketaz
چهارشنبه 17 آذر 1389, 14:05 عصر
همون طوری که در پست اولم گفتم خواهشا مطالب کلی و مبهم نگید یعنی چی که دست و پا گیر میشه؟ یک لینک یا مثال معتبر لطفا ... من که شما رو نمیشناسم تسلط شما رو روی سه لایه نمیدونم خودمم تجربه ای ندارم میتونم با خودم بگم حرف شما در اثر تسلط کمتون روی مبحث سه لایست یا عادت به شیوه کد زنی سنتی شایدم کاملا حق با شما باشه.................. منظور از حرفم اینه که نظراتی که دوستان میدن روشن باشه که میشه به راحتی با یک مثال مطلب رو روشن کرد ......................
تا اونجایی که من میدونم برنامه نویسی سه لایه برای هر نوع برنامه نویسی (یعنی هر مثالی!) به درد نمیخوره ... چرا ؟ چون که همان طور که میدونید برنامه نویسی سه لایه از معایبش اینه که Performance برنامه رو پایین میاره ( بع علت ارتباط زیاد بین لایه ها!)و برای برنامه هایی که Performance در اولویت هستن مسلما آنچنان مفید نخواهد بود.. یا در برنامه هایی که لایه کاربری بسیار اهمیت داره نیز مناسب نمی باشند ...

موفق باشید

ostovarit
چهارشنبه 17 آذر 1389, 19:52 عصر
این یک فرم ثبت نام سادست هدف پیاده سازی قوانین برنامه نویسی سه لایه و بدست اوردن یک نمونه برنامه سه لایه بدون نقص هست ... پروژه انجام شده با توجه به مقالاتی که ادرسش رو گذاشتم واطلاعات قبلیم نوشته شده ...

ابتدا اومدم یک پروژه جدید WinForm ایجاد کردم (لایه GUI) و بعد دو ClassLibrary به نام های BLL به پروژم اضافه کردم دیتابیس و یک جدول به نام CustomerReg برای ذخیره داده ساختم ...
در لایه DAL کلاسی به نام myConnection ایجاد کردم و در هر بار اتصال به دیتابیس اون کلاس رو خوندم ارتباط رو Open و بعد Close کردم...
در کلاس SQLActivity متد های کار با پایگاه داده رو پیاده سازی کردم و بعد یک کلاس برای جدول CustomerReg درست کردم و داخلش متدهای مربوط به insert , update , delete , search رو پیاده کردم که هر کدوم از این متد ها اشاره به Stored Procedures مربوط به خود دارند ...
کارم اینجا با لایه DAL تموم میشه و میرم سراغ لایه BLL ابتدا با AddRefrence لایه DAL رو به این لایه اضافه میکنم و بعد متد هایی رو برای عملیات های insert , update delete , search و... تعریف کرده و بعد از اعتبار سنجی داده ها متد های ساخته شده در لایه DAL رو فراخوانی میکنم اینجا هم دیگه کاری نداریم ...
لایه آخر(GUI) بعد از طراحی لایه BLL رو AddRefrence میکنم و در باتن ها و تکست باکس ها کد های مربوطه رو وارد میکنم و متدهای تعریف شده در BLL رو استفاده و پارامتر های مورد نیاز رو set میکنم.

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

epsi1on
چهارشنبه 17 آذر 1389, 21:17 عصر
سلام دوست من.
من تجربه ای به اون صورت در زمینه برنامه نویسی (خصوصا برنامه نویسی به این صورت لایه ای) ندارم، ولی چند تا نکته به ذهنم رسید که شاید مفید باشن.
یجورایی اصلا انگار از نمونه های کلاس Customers به عنوان یک شی تجاری (یا Business Object) نمیشه استفاده کرد (شما سه تا Property با محدوده ی Public به نامهای FullName و Email و Mob به این کلاس اضافه کردید، ولی اصلا ازشون استفاده نشده! (نه جایی مقدار دهی شدن و نه جایی مقدارشون استفاده شده...).
دوم اینکه Validation بعضا در لایه ی واسط کاربرتون انجام میشه در حالی که طبق اون اصلی که میگه تمام Business Rule ها و data Validation و data processing و ... باید در لایه تجاری برنامه باشه در تناقض هست.
سوم اینکه این Business Object فقط با Windows Forms سازگار هست و مثلا با WPF سازگار نیست...
متاسفانه خیلی وقت ندارم که بیشتر دقت کنم و بیشتر عملی با این قضیه برنامه نویسی لایه ای آشنا شدم تا هم علمی و هم عملی و این نکاتی بود که گذرا به ذهنم رسید، خیلی هم با مبانی و اصولش آشنا نیستم ولی فکر کردم دقت این چند نکته ای که به ذهنم رسید برای شما خالی از لطف نباشه...

ostovarit
چهارشنبه 17 آذر 1389, 21:24 عصر
سلام دوست من.
من تجربه ای به اون صورت در زمینه برنامه نویسی (خصوصا برنامه نویسی به این صورت لایه ای) ندارم، ولی چند تا نکته به ذهنم رسید که شاید مفید باشن.
یجورایی اصلا انگار از نمونه های کلاس Customers به عنوان یک شی تجاری (یا Business Object) نمیشه استفاده کرد (شما سه تا Property با محدوده ی Public به نامهای FullName و Email و Mob به این کلاس اضافه کردید، ولی اصلا ازشون استفاده نشده! (نه جایی مقدار دهی شدن و نه جایی مقدارشون استفاده شده...).
دوم اینکه Validation بعضا در لایه ی واسط کاربرتون انجام میشه در حالی که طبق اون اصلی که میگه تمام Business Rule ها و data Validation و data processing و ... باید در لایه تجاری برنامه باشه در تناقض هست.
سوم اینکه این Business Object فقط با Windows Forms سازگار هست و مثلا با WPF سازگار نیست...
متاسفانه خیلی وقت ندارم که بیشتر دقت کنم و بیشتر عملی با این قضیه برنامه نویسی لایه ای آشنا شدم تا هم علمی و هم عملی و این نکاتی بود که گذرا به ذهنم رسید، خیلی هم با مبانی و اصولش آشنا نیستم ولی فکر کردم دقت این چند نکته ای که به ذهنم رسید برای شما خالی از لطف نباشه...

از نظراتی که دادی ممنونم ....

یک سوتی هم تو قسمت ویرایش گرفتم ....

حالا دوستان دیگه هم نظراتشون رو بدن یک دفعه همه رو اعمال میکنم و دوباره آپ میکنم ...
در مورد WPF هم چون هنوز مطالعه ای دربارش نداشتم نمیدونم منظورتون چیه ...
انشالله بعد از مطالعه LinQ و WPF تغیراتی لازم بود در پروژه میدم ...

Felony
چهارشنبه 17 آذر 1389, 22:12 عصر
طبق مطلبی که در یکی از مقاله های فوق نوشته شده بود: http://www.how2learnasp.net/article....8-b75d804d6e2c یک لایه به نام CashLayer بین GUI و BLL قرار میگیره ( اجباری نیست ) که حاوی اطلاعاتی هست که ثابت هستن تا نیازی نباشه تمامی اطلاعات از دیتابیس سلکت زده بشه ... این لایه فقط در پروژه های وب هست یا در پروژه های ویندوزی هم استفاده داره؟ اگر استفاده داره یک نمونه مثال بزنید؟ و این اطلاعات چه چیزایی میتونه باشه؟
برنامه نویسی لایه ای دارای استاندارد خاصی نیست و یه قرار داد هست که شما اگر رعایتش کنید یکسری مزایا برای برنامتون داره ، اون لایه Cache Layer ( نه Chash Layer ) هم به همین منوال هست و میتونه تو پروژه های ویندوزی هم کاربرد داشته باشه ، مثلا فرض کنید یه برنامه برای یه آژانس هواپیمایی نوشتید و چند کاربر تحت شبکه محلی باهاش کار میکنن ، هر روز تعرفه بلیط ها تغییر پیدا میکنه ، برنامه های کاربران برای صادر کردن هریک بلیط باید به بانک سرور مراجعه کنه و ازش درخواست تعرفه امروز اون بلیط رو بده ، حالا فکر کن 10 تا کاربر در روز بخوان 100 تا بلیط صادر کنن ، میشه 1000 بار مراجعه به سرور برای گرفتن یک تعرفه که تو اون روز ثابت هست ، با اضافه کردن لایه Chache Layer برنامه های کلاینت میتونن اول صبح که شروع به کار میکنن یک بار تعرفه های رو از رو سرور بخونن و و تو لایه Chache Layer خودشون نگه داری کنن و هر بار برای صدور بلیط به Cache Layer مراجعه کنن نه سرور و اگر هم وسط روز تعرفه ای تغییر پیدا کرد سرور به کلاینت ها خبر میده و Cache Layer با تعرفه های جدید به روز رسانی میشه ، با این شیوه سرعت برنامه افزایش و بار روی شبکه کاهش پیدا میکنه .

این ساده ترین سناریویی بود که میشد برای Chache Layer تو برنامه های Windows Base در نظر گرفت .

موفق باشید .

epsi1on
چهارشنبه 17 آذر 1389, 22:43 عصر
ا
در مورد WPF هم چون هنوز مطالعه ای دربارش نداشتم نمیدونم منظورتون چیه ...

منظورم صرفا WPF نبود دوست من، چون نمیخواستم نظرم رو کلی بگم اون مثال رو زدم. اگر کلی تر بخوام نظر بدم منظوروم این میشه که به نظرم بهتره معماریتون طوری باشه که صرفا مختص یک سیستم واسط کاربر نباشه (Widows Forms یا WPF یا ASP.Net یا ...) و بشه UI ی برنامه رو با هر کدوم از اینها ایجاد کرد، بدون اینکه در لایه تجاری برنامه تغییر بدیم.

cjNet
پنج شنبه 18 آذر 1389, 07:44 صبح
بازم سلام .

تا اونجایی که من میدونم برنامه نویسی سه لایه برای هر نوع برنامه نویسی (یعنی هر مثالی!) به درد نمیخوره ... چرا ؟ چون که همان طور که میدونید برنامه نویسی سه لایه از معایبش اینه که Performance برنامه رو پایین میاره ( بع علت ارتباط زیاد بین لایه ها!)و برای برنامه هایی که Performance در اولویت هستن مسلما آنچنان مفید نخواهد بود..

تا حدودی درسته ...
اما همون طور که خودتون می دونید هر روشی که در برنامه نویسی به کار می ره در کنار مزایایی که داره می تونه معایبی هم داشته باشه :
مهمترین مزیت های برنامه نویسی چند لایه ( مثلا سه لایه ) امنیت به مراتب بالاتر نسبت به روشهای دیگه ، تجزیه برنامه به بخش های کوچک تر ( که همین مساله باعث سادگی و نوشتن کد ها بهینه میشه ) ، توسعه وپیشرفت سریع تر پروژه ها ( که یکی از دلایل اصلی به وجود آمدن چنین روشی است ، که هر گروه از برنامه نویسان می توانند به طور موازی و هم زمان لایه ها برنامه رو ایجاد کنند که این یعنی افزایش سرعت تولید نرم افزار ( زمان یکی از فاکتور های اصلی تولید نرم افزار است )) و ... .
Performance ( کارایی ) در برنامه نویسی چند لایه تا حدود زیادی به نحوه پیاده سازی اون بستگی داره :
یکی از مزایای استفاده از ClassLibrary در این روش این است که هر لایه در واقع تبدیل به یک DLL که یک فایل اجرایی هست میشه و خودبه خود مرحله کامپایل شدن در هر فراخوانی از بین میره ( این یعنی افزایش سرعت تا حدودی ).
البته سرعت پایین تر یکی از معایب برنامه نویسی چند لایه است که اونم به قول معروف هر نکته زمانیو هر روش مکانی دارد :لبخندساده:


یا در برنامه هایی که لایه کاربری بسیار اهمیت داره نیز مناسب نمی باشند ...
دوست عزیز این مطلبی رو که ذکر کردید من متوجه نشدم اگه بیشتر توضیح بدید ممنون میشم ...

cjNet
پنج شنبه 18 آذر 1389, 08:27 صبح
ابتدا اومدم یک پروژه جدید WinForm ایجاد کردم (لایه GUI) و بعد دو ClassLibrary به نام های BLL به پروژم اضافه کردم دیتابیس و یک جدول به نام CustomerReg برای ذخیره داده ساختم ...
در لایه DAL کلاسی به نام myConnection ایجاد کردم و در هر بار اتصال به دیتابیس اون کلاس رو خوندم ارتباط رو Open و بعد Close کردم...
در کلاس SQLActivity متد های کار با پایگاه داده رو پیاده سازی کردم و بعد یک کلاس برای جدول CustomerReg درست کردم و داخلش متدهای مربوط به insert , update , delete , search رو پیاده کردم که هر کدوم از این متد ها اشاره به Stored Procedures مربوط به خود دارند ...
کارم اینجا با لایه DAL تموم میشه و میرم سراغ لایه BLL ابتدا با AddRefrence لایه DAL رو به این لایه اضافه میکنم و بعد متد هایی رو برای عملیات های insert , update delete , search و... تعریف کرده و بعد از اعتبار سنجی داده ها متد های ساخته شده در لایه DAL رو فراخوانی میکنم اینجا هم دیگه کاری نداریم ...
لایه آخر(GUI) بعد از طراحی لایه BLL رو AddRefrence میکنم و در باتن ها و تکست باکس ها کد های مربوطه رو وارد میکنم و متدهای تعریف شده در BLL رو استفاده و پارامتر های مورد نیاز رو set میکنم.

خوشحال میشم پروژه رو ببینید و ایرادات رو با توضیح بفرمایید...سلام .
اگه برای اولین بارته که برنامه سه لایه می نویسی ، میشه گفت خوبه ...
اما شما به یک نکته ای که خیلی کم دقت کردی ، بحث Validation ( اعتبار سنجی ) هست . شما اعتبار سنجی رو فقط در حد بودن یا نبودن مقدار در TextBox ها انجام دادی در حالی که اعتبار سنجی اطلاعات بحث مهم و حیاتی برنامه های اطلاعاتی هست . ( اگه حتی یک فیلد هم اطلاعات نادرست داشته باشه اعتبار کل برنامه زیر سوال میره ) .
در برنامه شما به اعتبار سنجی قسمت ایمیل و تلفن همراه توجه نشده . برای مثال من می تونم مقدار aaa رو به عنوان ایمیل و مقدار 111 رو به عنوان شماره تلفن همراه وارد کنم در صورتی که همون طور که هممون می دونیم فرمت ایمیل به صورت Sample@site.ext هست و شماره تلفن همراه با 09 آغاز میشه و حتما باید 11 رقم باشه .
در برنامه های تحت وب بسیاری از این اعتبار سنجی های اولیه با استفاده از کنترل های آماده خود ASP.net در همون لایه presentation انجام میشه و در لایه BLL اعتبار سنجی های پیچیده تر انجام میشه .

به نظر من شما یک کلاس به نام Validator در لایه BLL ایجاد کن و توی اون به ازای هر نوع اعتبار سنجی یک متد ایجاد کن ( مثلا برای اعتبار سنجی ایمیل ها یک متد و برای اعتبار سنجی تلفن همراه یک متد دیگر و ... ) و مقدار بازگشتی متد ها رو از نوع bool قرار بده ...
شما اصلا از property های کلاس Customer استفاده نمی کنید و مقادیر رو مستقیما به متد می فرستید که این کار درستی نیست . با این کار امنیت برنامه رو پایین میارید و هم اعتبار سنجی رو مشکل تر میکنید .
از کلاس Validator در بخش set مشخصه(property )های کلاس Customers استفاده کن به این صورت که اگر مقدار وارد شده ( مثلا ایمیل ) درست بود اون موقع مقدار رو در فیلد set کن در غیر این صورت با یک پیغام یا با استفاده از کنترل error Provider این مساله رو به اطلاع کاربر برسون تا اطلاعات وارد شده رو اصلاح کنه .

امیدوارم مفید باشه .... :لبخندساده:

amir-yeketaz
پنج شنبه 18 آذر 1389, 09:58 صبح
بازم سلام .

تا حدودی درسته ...
اما همون طور که خودتون می دونید هر روشی که در برنامه نویسی به کار می ره در کنار مزایایی که داره می تونه معایبی هم داشته باشه :
مهمترین مزیت های برنامه نویسی چند لایه ( مثلا سه لایه ) امنیت به مراتب بالاتر نسبت به روشهای دیگه ، تجزیه برنامه به بخش های کوچک تر ( که همین مساله باعث سادگی و نوشتن کد ها بهینه میشه ) ، توسعه وپیشرفت سریع تر پروژه ها ( که یکی از دلایل اصلی به وجود آمدن چنین روشی است ، که هر گروه از برنامه نویسان می توانند به طور موازی و هم زمان لایه ها برنامه رو ایجاد کنند که این یعنی افزایش سرعت تولید نرم افزار ( زمان یکی از فاکتور های اصلی تولید نرم افزار است )) و ... .
Performance ( کارایی ) در برنامه نویسی چند لایه تا حدود زیادی به نحوه پیاده سازی اون بستگی داره :
یکی از مزایای استفاده از ClassLibrary در این روش این است که هر لایه در واقع تبدیل به یک DLL که یک فایل اجرایی هست میشه و خودبه خود مرحله کامپایل شدن در هر فراخوانی از بین میره ( این یعنی افزایش سرعت تا حدودی ).
البته سرعت پایین تر یکی از معایب برنامه نویسی چند لایه است که اونم به قول معروف هر نکته زمانیو هر روش مکانی دارد :لبخندساده:


دوست عزیز این مطلبی رو که ذکر کردید من متوجه نشدم اگه بیشتر توضیح بدید ممنون میشم ...
من هم یکی از مبتدیان کار با این نوع برنامه نویسی هستم ولی خوب یه خورده وقت روش گذاشتم و یه پروژه رو باهاش انجام دادم (همش به خاطر این دانشگاس که نمیذاره به کارمون برسیم!!)
همون طور که میدونید یکی از مزیت های برنامه نویسی سه لایه اینه که میتونید برنامه ی مبتنی بر ویندوز (winbase) رو خیلی خیلی راحت تر و سریعتر(اصل قضیه سرعته!) به برنامه مبتنی بر وب(Wiebbase) تبدیل کنید ... حال چه لایه ای برای تبدیل این کار باید تغییر زیادی پیدا کنه؟مسلما لایه کاربری است(البته من در حوزه ی دات نت میگم!) (هر چند که دات نت سعی کرده تا اونجا که بشه Web Controls ها بسیار شبیه به Win controls ها عمل کنن!) ... پس با این شرایط اگر که برنامه ی شما با لایه کاربری خیلی بیشتر از بقیه ی لایه ها سروکار دارد و اصلا لایه کاربری مهمترین نقش را ایفا میکند بهتر است که از این برنامه نویسی سه لایه استفاده نشه ! چون که ما در برنامه نویسی سه لایه متحمل رعایت کردن بسیاری از قواعد هستیم ...

موفق باشید

shima2006
پنج شنبه 18 آذر 1389, 10:21 صبح
با تشکر از دوست عزیز epsilon ، دو تا سوال برام پیش اومد:

دوم اینکه Validation بعضا در لایه ی واسط کاربرتون انجام میشه در حالی که طبق اون اصلی که میگه تمام Business Rule ها و data Validation و data processing و ... باید در لایه تجاری برنامه باشه در تناقض هست.

این یعنی این که حتی وقتی میخواهیم از رویدادی مثل KeyPress استفاده کنیم باید متد مربوطه از کلاس BOL رو فراخوانی کنیم؟!


اگر کلی تر بخوام نظر بدم منظوروم این میشه که به نظرم بهتره معماریتون طوری باشه که صرفا مختص یک سیستم واسط کاربر نباشه (Widows Forms یا WPF یا ASP.Net یا ...) و بشه UI ی برنامه رو با هر کدوم از اینها ایجاد کرد، بدون اینکه در لایه تجاری برنامه تغییر بدیم.
چطور باید معماری رو طوری طراحی کرد که صرفا مختص یک سیستم واسط کاربر نباشه ؟! آیا این موضوع مستلزم این هست که به هر دو معماری Web & Win Form مسلط باشیم ؟
برای مثال من با WinForm کار میکنم و به من گفتن باید برنامم طوری باشه که با وب هم مشکلی نداشته باشه! ولی واقعا نمیدونم چطوری باید این کار رو انجام بدم!! آیا برای این منظور باید به Asp.Net هم تسلط کافی رو داشته باشم یا نیازی به این کار نیست؟!

M.YasPro
پنج شنبه 18 آذر 1389, 11:26 صبح
کپسوله‌سازی (به انگلیسی (http://barnamenevis.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86_%D8%A7%D9%86%DA%AF%D9%84% DB%8C%D8%B3%DB%8C): Encapsulation) مخفی‌سازی، یا لفافه‌بندی، در علم رایانه (http://barnamenevis.org/wiki/%D8%B9%D9%84%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86% D9%87) مخفی سازی مکانیزم داخلی و ساختار داده‌های اجزای نرم‌افزار (http://barnamenevis.org/wiki/%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A 7%D8%B1) در پشت یک رابط کاربر (http://barnamenevis.org/wiki/%D8%B1%D8%A7%D8%A8%D8%B7_%DA%A9%D8%A7%D8%B1%D8%A8% D8%B1) است. بدین طریق کاربر یک نرم‌افزار (http://barnamenevis.org/wiki/%D9%86%D8%B1%D9%85%E2%80%8C%D8%A7%D9%81%D8%B2%D8%A 7%D8%B1) فقط نیاز دارد که بداند آن قطعه نرم‌افزاری چه می‌کند و نمی‌تواند آنها را منوط به چگونگی اجرای آنها بکند.
عمل مخفی‌سازی باعث می‌شود که اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.
منبع : ویکی پدیا



با تعریف بالا فکر می کنم بشه اینجوری تعمیمش داد که توی معماری لایه ای برای لایه ها فرقی نداره که لایه نمایش winBase یا webBase یا .. باشه . لایه های پایین تر اطلاعات رو میفرستند به لایه های بالاتر فارق از اینکه بدونن لایه بالاتر از چه جنسی هستند .

ostovarit
پنج شنبه 18 آذر 1389, 12:29 عصر
سلام .
اگه برای اولین بارته که برنامه سه لایه می نویسی ، میشه گفت خوبه ...

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

شما اصلا از property های کلاس Customer استفاده نمی کنید و مقادیر رو مستقیما به متد می فرستید که این کار درستی نیست . با این کار امنیت برنامه رو پایین میارید و هم اعتبار سنجی رو مشکل تر میکنید .



با تشکر از توجه شما مطلبی که گفتید بجا و مفید بود...
بله اولین برنامه سه لایه من هست ...
برنامه هایی رو برای کار با ایمیل و پیامک نوشتم (www.ostovarit.com (http://www.ostovarit.com)) با ولیدیت کردن اطلاعات اشنایی دارم ولی چون میخواستم زودتر در بحث سه لایه وارد شم رو این موارد وقت نذاشتم که در نسخه بعدی انجامش میدم...

چرا ارسال مقادیر به صورت مستقیم به متد امنیت برنامه را پایین میاره؟
مطلب دیگه اینکه برای ارسال مقادیر از لایه BLL به DAL چطور عمل کنم همین که مقادیر داخل متد پاس داده میشه خوبه یا اینکه از طریق پراپرتی ها باز این کار صورت بگیره؟

با تشکر از تمام دوستانی که در بحث شرکت میکنن


منظورم صرفا WPF نبود دوست من، چون نمیخواستم نظرم رو کلی بگم اون مثال رو زدم. اگر کلی تر بخوام نظر بدم منظوروم این میشه که به نظرم بهتره معماریتون طوری باشه که صرفا مختص یک سیستم واسط کاربر نباشه (Widows Forms یا WPF یا ASP.Net یا ...) و بشه UI ی برنامه رو با هر کدوم از اینها ایجاد کرد، بدون اینکه در لایه تجاری برنامه تغییر بدیم.

متوجه منظورتون شدم ولی نمیدونم چطور این کار رو بکنم اگر امکانش باشه میخوام یک نمونه از ایرادات رو با درج کد از پروژم و نوشتن صحیح اون اینجا مثال بزنید ممنونم

ostovarit
پنج شنبه 18 آذر 1389, 19:02 عصر
نسخه دوم ----------------------------
صمیمانه از دوستانی که در این تاپیک شرکت میکنن و نظراتشون رو میدن تشکر دارم در نسخه دوم برخی از مشکلاتی که دوستان گفته بودند رفع شد:
یک سری پراپرتی تعریف کرده بودم که استفاده نشده بود این مورد رفع شد و مقادیر از طریق پراپرتی ها ارسال و دریافت شد...
مشکلی در ویرایش بود، به اشتباه خطای تکراری بودن نام رو میداد که رفع شد
برای اعتبار سنجی مقادیر وارد شده در ایمیل و شماره همراه کلاسی در لایه BLL اضافه شد که این کار رو انجام میده ...
و برای ورود اطلاعات برای هر تکست باکس سمپل هایی رو گذاشتم داخل هر کدوم ...

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

epsi1on
پنج شنبه 18 آذر 1389, 21:29 عصر
این یعنی این که حتی وقتی میخواهیم از رویدادی مثل KeyPress استفاده کنیم باید متد مربوطه از کلاس BOL رو فراخوانی کنیم؟!

سلام دوست من.
نه الزاما اینطور! (اصلا خیلی چالشها به نظر میرسه اگر بخوایم معماریمون رو اینطور بنا کنیم). الزامی نیست که فقط و فقط اجازه بدیم که پراپرتی هامون با داده معتبر مقدار دهی بشن، میتونیم اعتبار سنجی رو بزاریم موقع ذخیره شی انجام بدیم.


چطور باید معماری رو طوری طراحی کرد که صرفا مختص یک سیستم واسط کاربر نباشه ؟! آیا این موضوع مستلزم این هست که به هر دو معماری Web & Win Form مسلط باشیم ؟
خیر دوست من. یک تکنولوژی هست که کار مارو راه میندازه و در هر سه این سیستمهای WPF و WindowsForms و ASP.Net پشتیبانی میشه و اون هم Data Binding هست. شما میتونید کلاسهاتون رو به نوعی ایجاد کنید که بطور کامل با Data Binding سازگار باشند، اونقط میتونید امیدوار باشید که اشیائتون هم در WPF و هم در سایر این سیستمها قابل استفاده هستند. لطفا به ادامه دقت کنید...


متوجه منظورتون شدم ولی نمیدونم چطور این کار رو بکنم اگر امکانش باشه میخوام یک نمونه از ایرادات رو با درج کد از پروژم و نوشتن صحیح اون اینجا مثال بزنید ممنونم
در ابتدا از دقتتون ممنونم، در ادامه باید عرض کنم همونطور که عرض کردم Data Binding در هر سه تکنولوژی WPF و WindowsForms و ASP.Net پشتیبانی میشه. اگر شما بخواید اشیائتون رو سازگار با این قضیه پیاده سازی بکنید باید سه اینترفیس IDataErrotInfo و IEditableObject و INotifyPropertyChanged رو که هر سه در فضای نام System.ComponentModel هستند رو اشیائتون پیاده سازی بکنند. توضیح بیشتری نمیدم چون اصلا دوست ندارم سلایق و برداشتهای بعضا اشتباهم رو به عنوان یک سری چیز دیگه بنویسم، ولی یک کتابی دیدم بنام Expert C# 2008 Business Objects که نوشته ی آقایی بنام Lhotka هست. در اصل این کتاب راهنمای Frameworkی هست که ایشون برای برنامه نویسی تجاری ایجاد کردند، ولی در چند فصلش به همین قضایا و اینکه با توجه به چه مسایلی و چگونه Frameworkشون رو طراحی کردن پرداخته شده که همین مواردی که من عرض کردم و بعضا چالشهایی که در معماریهای متفاوت ممکنه بهش بر بخوریم هم بیان شده (مثلا اینکه توی یه قسمت گفته میخوایم اعتبار سنجی بکنیم، مثلا وقتی کاربر دکمه OK رو کلیک کرد اونوقت مقدار تکس باکس فلان رو بریزیم داخل پراپرتی نام مشتری، حالا اگر نام غیر مجاز بود چی؟ (مثلا اگر داده ای در تکس باکس نبود یا کاربر یک عدد رو بعنوان نام وارد کرده بود) میتونیم قبل از اینکه مقدار تکس باکس رو بریزیم داخل پراپرتی چکش کنیم که معتبر باشه و اگر نبود یه پیغام به کاربر نشون بدیم، ولی نه اینطوری اعتباز سنجی توی لایه ی واسط کاربر انجام میگیره و صحیح نیست، پس بیایم موقع Set شدن پراپرتی نام مشتری اعتبار سنجی کنیم و اگر داده غیر معتبر بود یک استثنا پرتاب کنیم، نه اینهم مناسب نیست، چون به هر حال اشایمون از ابتدا ممکنه مقادیر غیر معتبر داشته باشن، پس ...*) که به نظر من خیلی ارزشمند هست و اگر بخوام خلاصه بگم جواب بسیاری از سوالاتتون رو با مطالعه اون کتاب میتونید بدست بیارید (یا اگر هم از ابتدا مطالعش کنید سوالات براتون پیش میاد و اغلب هم حل میشه!).
در هر حال امیدوارم در رسیدن به هدقتون موفق باشید و بزودی معماری مورد نظرتون که بقولی در مبانیش تناقض نداشته باشه رو ایجاد کنید (حداقل در حد این برنامه کوچکی که در حال ارتقاش هستید) و با Framework همین آقای Lhotka به حد کافی آشنا بشید که جواب این سوالاتتون رو بگیرید و به هدفتون هم برسید...

پ.ن:
* - بابت این پرانتز حجیم عذر خواهی میکنم!... :)

ostovarit
جمعه 19 آذر 1389, 00:51 صبح
با تشکر از توضیح کامل و راهنمایی دوست خوبم ... این کتاب رو میتونید از لینک زیر دانلود کنید ...
http://datacenter.ustmb.ac.ir/detail.php?id=141#id_141
نام كتاب : Expert C# 2008 Business Objects

سال انتشار : 2008

نویسنده : Rockford Lhotka

ناشر : Apress

فرمت : pdf

حجم : 23.4 MB

موضوع : C#


Contents at a Glance:

■CHAPTER 1 Distributed Architecture

■CHAPTER 2 Framework Design

■CHAPTER 3 Object-Oriented Application Design

■CHAPTER 4 CSLA .NET Object Stereotypes

■CHAPTER 5 CSLA .NET Object Templates

■CHAPTER 6 Business Framework Implementation

■CHAPTER 7 Property Declarations

■CHAPTER 8 Object Status Management

■CHAPTER 9 Parent-Child Relationships

■CHAPTER 10 Data Binding

■CHAPTER 11 Business and Validation Rules

■CHAPTER 12 Authentication and Authorization

■CHAPTER 13 N-Level Undo

■CHAPTER 14 LINQ to CSLA

■CHAPTER 15 Persistence and the Data Portal

■CHAPTER 16 Other Framework Features

■CHAPTER 17 Business Object Implementation

■CHAPTER 18 Example Data Access

■CHAPTER 19 Windows Presentation Foundation UI

■CHAPTER 20 Web Forms UI

■CHAPTER 21 WCF Service Interface


به کوشش : حسین حاجی عبدالغفار
http://barnamenevis.org/Files/EBook/Software%20EBook/C%20sharp/Expert%20C%202008%20Business%20Objects%20-%20Apress%20-%202008/Expert%20C%202008%20Business%20Objects%20-%20Apress%20-%202008.jpg

cjNet
شنبه 20 آذر 1389, 02:26 صبح
سلام .

چرا ارسال مقادیر به صورت مستقیم به متد امنیت برنامه را پایین میاره؟با نگاه برنامه نویسی تحت وب اگه این مساله رو مطرح کنم فکر کنم بهتر جا می افته :
شما فرض کنید مثلا در قسمت ورود ( Login ) سایت شما ، شخصی ( مثلا هکر ) به جای نام کاربری ، یک script یا کد مخرب وارد کنه ، و برنامه شما هم بدون هیچ نظارتی بر مقادیر وارد شده ، مقدار نام کاربری ( script یا کد مخرب ) رو مستقیما به متد می فرسته و متد هم ناخواسته این کد ها رو در برنامه شما ( دیتابیس ) اجرا میکنه ، که این اجرا میتونه آسیبهایی به دیتابیس شما وارد یا بخشی از اطلاعات محرمانه شما رو در اختیار هکر قرار بده !!!
شما به ساده ترین وجه از property ها در برنامه خود استفاده کرده اید و نظارتی بر get و set شدن مقادیر در property ها نداشتید که خود این نظارت ها بحث جداگانه ای رو مطلبه که هم من کاملا بهش مسلط نیستم وهم فکر نکنم به موضوع این تایپیک مربوط باشه ...


مطلب دیگه اینکه برای ارسال مقادیر از لایه BLL به DAL چطور عمل کنم همین که مقادیر داخل متد پاس داده میشه خوبه یا اینکه از طریق پراپرتی ها باز این کار صورت بگیره؟برای انتقال مقادیر از لایه BLL به DAL نیازی نیست از property ها استفاده کرد ( به نظر من ) اما همون طور که واضحه اگه لایه ای کار خودشو به درستی انجام نده ، می تونه امنیت و صحت اطلاعات برنامه رو تهدید کنه ،
مثلا اگه لایه BLL وظیفه اعتبار سنجی ، نظارت ( امنیتی ) و... رو درست رعایت نکنه میتونه بر عملکرد لایه های دیگر و در نتیجه بر عمکلرد کل برنامه تاثیر بذاره ... ( البته ناگفته نمونه که در برخی لایه بندی ها ، لایه جداگانه ای به نام Security ( امنیت ) وجود داره ) .

امیدوارم مفید باشه ....

ostovarit
یک شنبه 21 آذر 1389, 14:39 عصر
در این کتاب که به زبان فارسی هست اشاره ای به برنامه نویسی سه لایه شده مطالبش برای من مفید بود ... البته این کتاب 950 صفحه است که سی شارپ رو کامل توضیح داده اما منظور من قسمتی هست که برنامه سه لایه رو توضیح داده ...

http://davatnamee.persiangig.com/Books/Learn%20Visual%20Farsi.rar

ostovarit
یک شنبه 26 دی 1389, 14:10 عصر
مطلب زیر برای کسانی که قصد شروع برنامه نویسی لایه ای رو دارند مناسبه :

مدل های متفاوت برنامه ها برای دستيابی به داده ها
مدل های دستيابی به داده ، همزمان با تکامل تدريجی کامپيوتر نيز متحول و دگرگون شده است ( از بشدت محلی بودن تا بشدت توزيع شده ) . همزمان با افزايش کاربران و حجم اطلاعات ، مدل دستيابی به داده از يک کاربر در رابطه با يک برنامه به چندين کاربر از طريق اينترنت، گسترش پيدا کرده است . آخرين تحول در اين راستا به مدل مبتنی بر سرويس های وب XML ، بر می گردد .
تعريف Tire : در يک مدل دستيابی به داده ، Tire ( رديف - طبقه ) ، يک سطح منطقی و يا لايه ای است که عناصر منطقی مربوط به يک برنامه بر روی آن مستقر می گردند( نه يک tire فيزيکی). . طبقات ( لايه ها ) ، می تواند بر روی يک و يا چندين کامپيوتر و يا حتی Tire فيزيکی، مستقر گردند . تعداد Tire ها به تعداد سطوح بر می گردد( نه تعداد کامپيوترهای فيزيکی که سرويس ها را تقسيم نموده اند) . اين سطوح عموما" دارای موارد زير است :


Client-tire . لايه فوق ، با نام Presentation و يا User Service نيز ناميده شده و شامل بخش رابط کاربر است .
Bussiness Logic Tire . شامل منطقی است که با منابع داده مرتبط می گردد . اين Tire ميانی (Middle) ، شامل بخشی از برنامه است که با داده ها مرتبط می گردد ( مثلا" ايجاد يک ارتباط با منبع داده). لايه فوق، اغلب بصورت فيزيکی و در تمام لايه ها پياده سازی می گردد . مثلا" بعنوان يک Stored Procedure در کنار منبع داده، يک کلاس همراه يک سرويس دهنده برنامه و يا حتی کدهای همراه برنامه سرويس گيرنده .

Data Service Tire . لايه فوق ، شامل داده هائی است که Bussiness Logic از آنان در برنامه ها استفاده می نمايد .
Interoperability . شامل منطقی است که امکان ارتباط بين برنامه های متعدد بر روی سيستم های عامل متفاوت و يا انواع متفاوت داده ها را فراهم می نمايد. مثلا" سرويس های وب XML می توانند توسط هر نوع سيستم عامل، ميزبان و استفاده گردند .

مزايای Tires مهمترين مزيت افزودن Tire ، قابليت گسترش و توسعه يک برنامه است . هر Tire اضافه، امکان افزودن کاربران بيشتر و ايزوله نمودن يک سطح از منطق برنامه را فراهم می نمايد . ايزوله نمودن منطق، اين امکان را فراهم می نمايد که تغييرات لازم در يک برنامه بدون نياز به اعمال تغييرات در ساير Tier ها ، صورت پذيرد. مثلا" در يک برنامه One-tire ، اعمال تغيير در هر سطح از منطق برنامه، مستلزم ترجمه مجدد برنامه و توزيع آن خواهد بود .

تکامل مدل های دستيابی
مدل های متفاوت دستيابی به داده به مرور زمان دچار تحول شده است .

http://srco.ir/Articles/images/CopyRight.jpg



One -Tire. مدل فوق، عموما" شامل يک کاربر بوده و تمامی سه لايه در يک کامپيوتر مستقر ( لايه بندی ) می شوند . مثلا" يک بانک اطلاعاتی شامل يک کاربر
مزايا : چون هر چيز در يک محل قرار می گيرد تمام عناصر بسادگی قابل دستيابی خواهند بود.
معايب : بهنگام سازی برنامه ها مستلزم کدهای اوليه برنامه بوده و پس از اعمال تغييرات و ترجمه مجدد ، می بايست برنامه برای هر يک از کاربران ارسال مجدد گردد. در اين مدل قابليت واقعی برای گسترش وجود ندارد .
Two-Tire . لايه User و Business Logic در يک Tire قرار گرفته و Data Service در لايه دوم قرار خواهد گرفت . مدل فوق، عموما" شامل دو و يا بيش از دو کامپيوتر است . مثلا" يک بانک اطلاعاتی که Businesses Logic بين دو Tire تقسيم می گردد . بخشی از منطق در برنامه سرويس گيرنده و بخشی ديگر بعنوان Stored procedure در Data Tire ذخيره می گردد.
مزايا : برخی از جداسازی ها را ارائه می نمايد .
معايب : توسعه مشکل خواهد بود، چراکه سرويس گيرندگان بصورت يک Fat Client مطرح و شامل لايه های Presentation و Business Logic می باشند. توزيع و پشتبانی نرم افزار يکی ديگر از مشکلات موجود در اين مدل است .
Three-Tire. هر سرويس در يک لايه مجزا قرار می گيرد. Bussiness Logic در يک Middle Tire جديد مستقر می گردد.
مزايا : نوع مطلوبی از جدا سازی را ايجاد نموده و حجم سرويس گيرنده نازک( لاغر!) می شود . در اين مدل سرويس گيرنده بصورت thin client بوده که صرفا" شامل منطق و يا لايه Presentation است.
معايب : مديريت آن بمراتب پيچيده تر بوده و از لحاظ امنيتی انعطاف و توسعه پذيری مدل N - Tier را ندارد .
N - Tire . يک بانک اطلاعاتی گسترده که دارای سرويس گيرندگان متعدد از طريق يک سرويس دهنده برنامه می باشد . Tier های جديد می تواند با توجه به ضرورت های منطقی مورد نياز، اضافه گردد .
مزايا : امکان اجرای برنامه های متعدد بر روی سيستم های عامل گوناگون بمنظور ارتباط با کاربر و داده فراهم می گردد .
معايب : مسايل مربوط به امنيت دارای چالش های خاص خود است . RPC)Remote Procedure Call) نمی تواند از طريق فايروال ها ،عبور داده شوند .
N-Tire with web Interface . سرويس ها بين اينترنت و اينترانت از طريق Tier اضافه سرويس دهندگان اختصاصی اضافه در شبکه، توزيع می گردد .
مزايا : هزينه بکارگيری نرم افزار بر روی سرويس گيرنده بسمت صفر ميل می کند . بهنگام سازی صرفا" بر روی سرويس دهندگان WEB و Application انجام خواهد شد . پروتکل HTTP امکان عبور از طريق فايروال را خواهند داشت .
معايب : دارای چالش های امنيتی خاص خود است .


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

ERIKA
جمعه 17 تیر 1390, 22:25 عصر
با سلام و تشکر از برنامه تون
من برای اینکه متوجه روند کار بشم یک نمونه از روی برنامه شما دارم میسازم حالا به مرحله ای رسیدم که باید پروسیجر هایش را را در اسکیوال بسازم همان کدهای شما را هم که مینویسم اجاره ذخیره ان را نمیدهد و با پیغام خطا زیر مواجه میشم :
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[DeleteCustomer]
(
@FullName nvarchar(50)
)
AS
Delete from RegCustomer where FullName=@FullName;
RETURN

.................................................. .................................
Msg 208, Level 16, State 6, Procedure DeleteCustomer, Line 8
Invalid object name 'dbo.DeleteCustomer'.
.................................................. .................................................. ........
نمی دانم مشکل از کجاست میشه یک راهنمایی بفرایید

mmd2009
جمعه 17 تیر 1390, 22:37 عصر
با سلام

دوست عزیز به جای خط زیر :


ALTER PROCEDURE [dbo].[DeleteCustomer]


باید این طوری بنوسید کد رو :


CREATE PROCEDURE [dbo].[DeleteCustomer]


دلیل : شما وقتی هنوز پروسیجری نساختید چگونه میخواهید تغییر ( ALTER ) کنید اون رو پس شما باید اول پروسیجر رو بسازید ( Create ) تا اجازه تغییر داشته باشید

موفق باشید

ERIKA
شنبه 18 تیر 1390, 10:38 صبح
با سلام

دوست عزیز به جای خط زیر :


ALTER PROCEDURE [dbo].[DeleteCustomer]


باید این طوری بنوسید کد رو :


CREATE PROCEDURE [dbo].[DeleteCustomer]


دلیل : شما وقتی هنوز پروسیجری نساختید چگونه میخواهید تغییر ( ALTER ) کنید اون رو پس شما باید اول پروسیجر رو بسازید ( Create ) تا اجازه تغییر داشته باشید

موفق باشید




با سلام و تشکر
حرف شما کاملا منطقی و قابل قبول
من alter بهcreateتغییر دادم و پروسیجر را ذخیره کردم حالا که مجددا آن را open میکنم کلمه alter به جای createتبدیل شده در پروژه خود ostevaritهم به همینصورت هست...چرا اینطور میشوند

mmd2009
شنبه 18 تیر 1390, 14:23 عصر
دوست عزیز اگر به حرف من تو قسمت بالا توجه کرده باشید میبینید که گفتم


پس شما باید اول پروسیجر رو بسازید ( Create ) تا اجازه تغییر داشته باشید

یعنی بعد از ساخت شما اجازه تغییر ان رو دارید. و فقط میتونید پروسیجر رو تغییرش بدید چون SQL با هوشی که داره میتونه تشخیص بده که شما اون پروسیجر رو قبلا ساختید و هنگام باز شدن برای شما به جای Create کلمه ALTER رو میذاره

StepUp360
دوشنبه 19 دی 1390, 18:03 عصر
سلام دوستان
من توی سایت رو گشتم و در مورد مطلبی که لازم داشتم بدونم نتونستم چیزی پیدا کنم

من میخوام توی لایه DAL به جای DataSet از Linq To Sql استفاده کنم ولی توی کلاس DAL اصلا نمیتونم از DataClasses1DataContext آبجکت درست کنم، تا بتونم به فیلدهای جدولم در دیتابیس دسترسی داشته باشم و همچنین نمیتونم مقداری رو به صورت Var تعریف کنم...چرا؟

لطفا راهنمایی کنید، و بگویید ایراد کار من کجاست؟ و چگونه از Linq To SQL در برنامه چند لایه میتونم استفاده کنم؟:گریه:

اسماعیل ابراهیمی
دوشنبه 19 دی 1390, 21:38 عصر
با سلام خدمت دوستان

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

موفق باشید

برنامه نویس - مقاله ای در مورد معماری 3 لایه (http://barnamenevis.org/showthread.php?321339-%D9%85%D9%82%D8%A7%D9%84%D9%87-%D8%A7%DB%8C-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-3-%D9%84%D8%A7%DB%8C%D9%87-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE)

Boy_nn
دوشنبه 03 بهمن 1390, 12:29 عصر
سلام به همه دوستان عزیز
چند تا سوال داشتم راجب برنامه نویسی سه لایه
1- اتصال دیتا ست به دیتا گرید در برنامه نویسی سه لایه به چه صورت است (درنظر بگیرید وقتی از طریق BindingSource به دیتا گیرید اتصال وصل می کنیم فیلتر کردن خیلی سریعتر صورت میگیره)
2- Linq در برنامه نویسی 3 لایه به چه صورت است

ممنون میشم دوستانی که بلد هستند هر چه سریعتر جواب بدند
در ضمن ممنون میشم سوالات بالا رو به صورت پروژه در یاست آپلود کنید

با سپاس

Boy_nn
دوشنبه 03 بهمن 1390, 18:10 عصر
سلام به همه دوستان عزیز
چند تا سوال داشتم راجب برنامه نویسی سه لایه
1- اتصال دیتا ست به دیتا گرید در برنامه نویسی سه لایه به چه صورت است (درنظر بگیرید وقتی از طریق BindingSource به دیتا گیرید اتصال وصل می کنیم فیلتر کردن خیلی سریعتر صورت میگیره)
2- Linq در برنامه نویسی 3 لایه به چه صورت است

ممنون میشم دوستانی که بلد هستند هر چه سریعتر جواب بدند
در ضمن ممنون میشم سوالات بالا رو به صورت پروژه در یاست آپلود کنید

با سپاس

Boy_nn
سه شنبه 04 بهمن 1390, 12:32 عصر
یعنی کسی جوابی نداره

mahdad sepah
سه شنبه 04 بهمن 1390, 12:57 عصر
دوستانی که از linq در معماری سه لایه استفاده کردند یک کمکی کنند خواهشا گویا برای خیلیا سواله

mahdad sepah
سه شنبه 04 بهمن 1390, 22:36 عصر
دوستان یکی یاری کنه مارو

hamed_blooki
پنج شنبه 06 بهمن 1390, 21:48 عصر
بهت توصیه میکنم کتاب اگه میتونی کتاب vb.net 2010 محسن مدحج رو بگیر به نظر من بهترین کتاب برنامه نویسی دات نت هستش که در ایران نوشته شده یک فصل رو به برنامه نویسی 3 لایه احتصاص داده .به صورت کاربردی به همراه یه پروژه سه لایه کامل

اینم سایتش برای مکاتبه وخرید کتاب :::

http://www.howprg.com/

Boy_nn
جمعه 07 بهمن 1390, 21:04 عصر
بهت توصیه میکنم کتاب اگه میتونی کتاب vb.net 2010 محسن مدحج رو بگیر به نظر من بهترین کتاب برنامه نویسی دات نت هستش که در ایران نوشته شده یک فصل رو به برنامه نویسی 3 لایه احتصاص داده .به صورت کاربردی به همراه یه پروژه سه لایه کامل

اینم سایتش برای مکاتبه وخرید کتاب :::

http://www.howprg.com/

متاسفانه لینک دانلودش خرابه
اگه سورس برنامه شو داری برای دانلود بزار

j_naroogha@yahoo.com
سه شنبه 16 اسفند 1390, 20:10 عصر
دوستان سلام
من این تاپیک رو دست وپا شکسته دنبال کردم.
آیا برنامه نویسی سه لا یه همون شی گرایی هست یا نه؟ اگه اینطور نیست آیا رابطه ای بین این دو وجود دارد؟

armin00
یک شنبه 08 آذر 1394, 15:40 عصر
نظر شخصی درباره هدف اصلی برنامه نویسی سه لایه الل خصوص در ویندوز اپلیکیشن :
با عرض سلام و خسته نباشید خدمت دوستان عزیز
بنده درباره برنامه نویسی سه لایه و مقایسه ان با برنامه نویسی دولایه یا معمولی یکسری مقایسات انجام دادمم. رئیس یک تیم نرم افزاری که به منظور استخدام با بنده مصاحبه میکرد گفت که تو باید برنامه رو سه لایه کنی تا در کدنویسی توی هر رویدادی مثلا event کلیک object باتن، یا هر شیء دیگری از هرنوع کلاسی مثل Data table یا SqlDataAdapter اینستنس(instance)جدیدی تولید نکنی. یک بار توسط کانستراکتور یا سازنده عمل initialize رو انجام بدی و در یک کلاس که خودت نوشتی قرار بدی.بعدا متدهایی برای کلاست بنویسی که مقادیررو به کلاس های SQL ایجاد شده یا همون initial شده انتساب بده و داخل event کلاس فرم که توسط خود ویژوال استودیوایجاد شده یک نمونه از اون کلاس یا همون ابجکت تولید شده توسط خود بسازی و فقط متد مربوطه از ابجکت ساخته شد توسط خود رو فراخوانی کنی.
پس با این حساب میشه نتیجه گرفت
{ :هدف از برنامه نویسی سه لایه، کاهش تعداد نجومی کلاس های تولید شده در کل میباشد؟}
یا اینطور نتیجه گیری نادرست است؟
دوستان حتما پاسخ بدن اگر صاحب نظر هستن...منتظر انبوهی از پاسخ های کارشناسی
هدف اصلی سه لایه رو هم ذکر کنید.
تشکر