با Web Service یا WCF میشه تا حد زیادی به این امر دست یافت .
با Web Service یا WCF میشه تا حد زیادی به این امر دست یافت .
با ویندوز هم کارای زیادی میشه انجام داد...
توضیح بده iroonidotnet
پ ن: این پست به نظرم بیشتر Off-Topic هستش ...
در صورت خروج از بحث، تذکر بدین
با تشکر
Web Service در حقیقت میتونه پیاده سازی Bussiness Layer باشه.(واسط بین DAL و UI)
من فکر می کنم کار Web service یک چیزه دیگه باشه !Web Service در حقیقت میتونه پیاده سازی Bussiness Layer باشه.(واسط بین DAL و UI)
و کمتر به عنوان Bussiness Layer استفاده میشه !
معمولا یک DAL,BLL,WSL رو در کنار هم داریم !
(داریم از بحث اصلی تاپیک خیلی دور میشیم !!)
فکر کنم اگه بریم سره یک مثال عملی محوریت کار بیشتر حفظ میشه !!
خواستن ، توانتستن است !!!
هدف من از طرح مسائل گفته شده، بیشتر رسیدن به این معاریه:
و امثال اون و شرح جزئیات آونه ...
ولی اگر باعث خروج از بحث میشه، تذکر بدین ...
با تشکر
دقیقا !!فاقا من فکر میکنم که Web service هدفش ایجاد یک لایه میانی جهت استفاده از منابع اشتراکی هست.
اما این به این معنا نیست که به عنوان BLL استفاده بشه !
معمولا یکی از مهمترن موارد استفاده از WebService در مواقعی است که سیستم ما یک سیستم توزیع شده باشه و ما دارای چندین BLL باشیم در این مواقع یکی از بهترین راه حل ها استفاده یک لایه به عنوان Web Service بین لایه UI و لایه BLL (که در حقیقت از چندین BLL تشکیل شده) می باشد که با این کار پیچیدگی دسترسی به اطلاعات رو برای لایه UI کمتر میکنه !
خواستن ، توانتستن است !!!
با سلام خدمت تمامی دوستان عزیزبسم الله الرحمن الرحیم
تا به این مرحله همه دوستان نظرات خود رو در باره معماری چند لایه ارائه دادن . و دوست عزیزمون جناب مهندس مداح در هر مرحله نتیجه گیری کلی از بحث دوستان رو به صورت نکته وار بیان کردن . در این مرحله که نیاز به یک نمونه برنامه برای یادگیری هرچه بیشتر این معماری احساس می شد . بنده تصمیم گرفتم که با ارائه یک نمونه ای کوچک و ساده کمکی هرچند کوچک به افرادی که به تازگی با این معماری آشنا شدن کرده باشم.
با مشورتی که صورت گرفت قرار شد یک نمونه بصورت ساده ارائه شود و پس از اشکال زدایی و بهبود آن از طرف دوستان برنامه نویس ، در مراحل بعدی این نمونه ارتقاع پیدا کند و با افزودن فناوری های جدید به آن ، به یک نمونه کامل تبدیل گردد.در این نمونه کوچک تصمیم داریم با استفاده از معماری چند لایه برای مشخصات افراد یک فرم ایجاد کنیم.
طرز ایجاد این پروژه رو به اختصار توضیح میدم و اگر دوستان خواستند کد ها (هر چند که واضح اند) رو شرح خواهم داد و انشا الله دوستان در بر طرف کردن نواقص و بهبود این نمونه همکاری خواهند کرد.
1)یک پروژه ویندوزی با نام SimpleN-Tier را ایجاد کرده
2)برای ایجاد لایه ی داده (DataAccessLayer ) بر روی SimpleN-TierSolution راست کلیک کرده و از قست Add زیر منوی New Project … را انتخاب کرده و در فرم جدید بر روی Class Library کلیک کنید و در قسمت Name نام لایه داده خود را تایپ کرده و Ok را کلیک کنید . شما موفق به ایجاد لایه داده شده اید . ما در این قسمت برای هر موجودیت (فرم یا جدول یا ...) یک کلاس ایجاد می کنیم و در آن عملیات درج و حذف و بروز رسانی و انتخاب را قرار میدهیم . در این نمونه ما این عملیات را با استفاده از Stored Procedure انجام میدهیم. (کلاس ایجاد شده را با نام Class1 را حذف کنید)
3)حالا نوبت به ایجاد لایه منطق (BusinesseLogicLayer ) می باشد که مراحل آن دقیقا مانند لایه داده می باشد . بعد از اینکه موفق به ایجاد لایه منطق شدید . باید بتوانید بین لایه منطق و لایه داده ارتباط برقرار کنید .( همانطور که میدانید لایه منطق از لایه داده درخواست انجام عملیات درج و ... را میکنید .)برای اینکه لایه منطق بتواند به لایه داده دسترسی داشته باشد ، در لایه منطق بر روی References راست کلیک کرده و بر روی زیر منوی Add Reference کلیک کرده و در فرم ظاهر شده بر روی تب Projects رفته و در این صفحه لایه داده خود را انتخاب و بر روی Ok کلیک کنید . حالا شما میتوانید در لایه منطق از لایه داده استفاده کنید .(کلاس ایجاد شده را با نام Class1 را حذف کنید)
نکته : در زمان بار کردن یک DLL ، سیستم عامل تلاش می کند تا آن را در آدرس پایه ای که در DLL مشخص شده است ، قرار دهد . اگر این آدرس توسط قطعه ای دیگر اشغال شده باشد ، سیستم باید عملیات تصحیحی لازم برای پیدا کردن یک بخش خالی دیگر در حافظه و قرار دادن DLL در آدرس جدید را انجام دهد . هر بار که یکDLL بار می شود این فرایند از نو تکرار می شود. برای اینکه این مشکل حل شود می توان یک آدرس پایه یکتا را به یک DLLنسبت داد . که در این صورت دیگر هزینه تصحیح را نخواهیم داشت. در C#.Net میتوان ازفضای آدرس های بین &H004000000 و &H800000000 استفاده کرد.
برای این کار بر روی نام پروژه ی BusinesseLogicLayer راست کلیک کرده و زیر منوی Properties را انتخاب کرده و به قسمت Build رفته و بر روی دکمه Advanced کلیک کرده و در
فرم ظاهر شده مقدار فیلد DLL Base Address را به 0x11280000 تغییر دهید .
4)لایه نمایش همان لایه است که در ابتدا هنگام ایجاد پروژه بصورت خود کار به پروژه شما افزوده شد . (SimpleN-Tier) . همانطور که می دانید لایه نمایش باید به لایه منطق (BusinessLogicLayer ) دسترسی داشته باشد . بدین منظور همان کاری که در مرحله قبل صورت گرفت را تکرار می کنیم تا لایه نمایش بتواند به لایه منطق دسترسی داشته باشد.
5)در آخر باید در لایه نمایش بر روی نام پروژه SimpleN-Tier راست کلیک کرده و از زیر منوی گزینه Set as startup project را انتخاب کنید. حالا مراحل ایجاد یک پروژه 3 لایه به پایان رسید
. کد های نمونه برنامه تا حد زیادی قابل فهم و واضح می باشد . دوستان اگر در جایی مشکل داشتن مطرح کنند تا رفع ابهام شود یا در صورت لزوم کد ها اصلاح شود. فایل های دیتابیس همراه این پروژه قرار داده شده است.
با تشکر
آخرین ویرایش به وسیله iroonidotnet : سه شنبه 07 مهر 1388 در 19:07 عصر
دوستان حال بر روی مثالی که کازیز iroonidotnet ارسال کردند بحث می کنیم،
لطفا" از ارسال پروژه خودداری نمایید و فعلا" تنها بر روی همین پروژه گفتگو نمایید،
هر زمان هم نیازی به تغییر در پروژه بود، کاربر iroonidotnet تغییران لازم را اغمال و پروژه جدید را آپلود می کنند،
از ایشان به خاطر این ارسال سپاسگزارم،/
I've just started tweeting!
@Alireza_Maddah
من نیز دانلود کردم ،
مشکلات :
نبود لایه Common یا transfer object در لایه بندی .
نحوه پاس دادن مقادیر بین لایه ها اصلا صحیح نیست . (اگر جدولی 20 فیلد داشته باشد یعنی 20 پارامتر )
مشکل در پاس دادن مقدار Null
مقدار بازگشتی خطاها از طریق throw کردن exception نمیباشد .
معماری تا rapid خیلی فاصله داره .
دوست عزیز خیلی ممنون از پیشنهاد شما . قرار هست این نمونه به تدریج کامل بشه . و به یک پیاده سازی کامل تبدیل بشه.
لطفا در این باره بیشتر توضیح بدید تا پس از نتیجه گیری نهایی تغییرات رو روی کد اعمال کنیم .نبود لایه Common یا transfer object در لایه بندی .
نحوه پاس دادن مقادیر بین لایه ها اصلا صحیح نیست . (اگر جدولی 20 فیلد داشته باشد یعنی 20 پارامتر )
مشکل در پاس دادن مقدار Null
با تشکر
البته اين روش پياده سازي در پروژه اي كه عمليات هاي زيادي داره يه خورده دردسر ساز ميشه. مثلاً شايد شما بخوايد عمليات هاي سيستم رو كه قرار هست در BLL پياده سازي بشه رو به صورت Project هاي مختلف در بياريد و هر Project براي خودش Class Libary هاي جداگانه اي داشته باشه. و اون موقع تشخيص BLL ها سخت ميشه. اين مثال براي UIL و DAL هم صدق مي كنه. شايد راه حل پيشنهادي اين باشه كه ClassLibary ها رو در يك Item دسته بندي مي كنيم ولي بازم مشكل ساز ميشه.
به هر حال اينم يك نوع پياده سازي هستش و مثل اينكه جواب هم داده.
از ArrayList استفاده مي شه.نحوه پاس دادن مقادیر بین لایه ها اصلا صحیح نیست . (اگر جدولی 20 فیلد داشته باشد یعنی 20 پارامتر )
ممنون . اگر دوستان نظر دیگه ای دارند خوشحال میشم .از ArrayList استفاده مي شه.
کاملا با شما موافقم . ولی باید به این نکته توجه کنید که این نمونه خیلی ابتدایی و فقط جهت آموزش است .البته اين روش پياده سازي در پروژه اي كه عمليات هاي زيادي داره يه خورده دردسر ساز ميشه. مثلاً شايد شما بخوايد عمليات هاي سيستم رو كه قرار هست در BLL پياده سازي بشه رو به صورت Project هاي مختلف در بياريد و هر Project براي خودش Class Libary هاي جداگانه اي داشته باشه. و اون موقع تشخيص BLL ها سخت ميشه. اين مثال براي UIL و DAL هم صدق مي كنه. شايد راه حل پيشنهادي اين باشه كه ClassLibary ها رو در يك Item دسته بندي مي كنيم ولي بازم مشكل ساز ميشه.
معمولا در پروژه های بزرگ کلاس هایی مانند Exception ها ، Enum و object های Data (میتواند tds یا ... )باشد .در این لایه قرار میگیرند . و بین پروژه های مختلف رد و بدل میگردند .
TypeDataSet و یا نمونه های معادل آن باعث خوانایی بیشتر سرعت نسبتا بهتر و .... برای ما به بار می آورد .
در همین مورد هم بجای ArrayList ما tds پاس میدیم .
اگر خواستید نمونه بزارم .
دوست عزیز اگر میشه بیشتر در TypeDatasetمزایای و کلاس هایی که فرمودید (Exceptionمثل) بیشتر توضیح بدید . ممنون
بهتر نیست کانکشن از فایل config دریافت بشه که قابلیت تغییر ساده تری برای کاربر داشته باشه . و یک کلاس جداگانه برای دریافت و ثبت اطلاعات ایجاد بشه تا نیازی به استفاده از کانکشن در همه متدها نباشه . یک متد که sqlcommand به آن پاس داده بشه و نتیجه برگشت داده شود .
متدهای SelectRow و SelectAll مقدار برگشتی از نوع Dataset دارند که میشه این مقادیر را از نوع DataRow و DataTable انتخاب کرد .
TypeDataSetیا TDS ها نوعی از اشیا داده هستند . TypeDataSet های ما از DataSet به ارث میروند .
TypeDataSetدر خودچه چیزی ذخیره میکنند :
مانندDataSet معمولی در خود جداول ، Relation مربوط به جداول و در کل میتوان گفت ساختار Data ما را در خود جا میدهد . و هر چیزی که در DataSet است در خود دارد . این اطلاعات در Compile time به ما ارایه میگردند نه runtime
چه مزیتی نسبت بهDataSet دارد :
tdsهمانطور که گفتم در خود ساختار Data را دارد و لازم نیست در Runtime انها اضافه گردند همچنین با در اختیار قراردادن آن ساختار به ما کمک زیاد در سریعتر نوشتن کدها و خوانایی برنامه به ما میکند و از نظر performance هم وضعیت بهتری دارد .
tdsها با اضافه کردن Adpter ( Adpater نوعی pattern است . این class ها ابزار های کار با class های دیگر هستند )های مخصوص خود کمک زیادی به ما برای عملیات اصلی بر روی جداول میکند . (بدون نوشتن یک خط کد و همه چیز در Designer انجام میشود) در ضمن این class ها چون partial هستند در فایلهای فیزیکی جداگانه میتوان آنها را توسعه داد .
نحوه ایجاد :
بر روی پروژه کلیک لاست میکنیم و از قسمتData گزینه DataSet را انتخاب میکنیم . میتوانیم از منوی view گزینه server explorer را انتخاب و پس از ساخت connection جداول آنرا به tds مان اضافه کنیم . اسم گزاری آن نیز معمولا نام class و انتهای آن DS میباشد مثلا UserDs
استثنا ها :ما میخواهیم عملکرد کار خود را از یک لایه به لایه دیگر بفهمانیم .
مثلا در عمل اگر موجودی انبار کافی نبود با خطای ذخیره داده فرق میکند و ما میخواهیم این موضوع را به کاربر اعلام کنیم . برای این کار 2 راه داریم متد ما باreturn value های مختلف ما را آگاه کند .
مثلا اگر -1 بود برای نبود موجودی کافی و -2 برای خطا در ذخیره سازی مشکل این روش نبود خوانایی آن است .
در روش دوم استثنا های مختلفی را ما ایجاد میکنیم .
مثال :
new InventoryException("item not found");
دوستان در پستهای قبلی یه مطلبی رو ذکر کردند که به نظر من اشتباهه
اینکه چند لایه نوشتن برنامه باعث کاهش کدنویسی میشه
که این دقیقا برعکسه
دوست عزیز چه دلیل فانغ کننده ای برای گفته ی خود دارید؟ لطفا" توضیحات بیشری ارائه دهید،/دوستان در پستهای قبلی یه مطلبی رو ذکر کردند که به نظر من اشتباهه
اینکه چند لایه نوشتن برنامه باعث کاهش کدنویسی میشه
که این دقیقا برعکسه
I've just started tweeting!
@Alireza_Maddah
دوست عزيز به اعتقاد من کاهش يا افزايش حجم کد نويسي بستگي مستقيم به نحوه تعريف لايه ها و نيز چگونگي معماري آنها دارد به نحوي که اين لايه بندي در درجه اول باعث کنترل و توسعه ساده تر پروژه گردد و در عين حال از کد نويسي هاي تکراري اجتناب شود . حال آنکه اگر به اين مهم که اساسا هدف از چند لايه کردن پروژه چيست توجه کافي نشود و صرفا بصورت کليشه اي و استاندارد شده با آن برخورد نمود به اعتقاد من نيز ممکن است باعث افزايش حجم کد نويسي و حتي در برخي موارد کاهش خوانايي برنامه گردد. به همين خاطر در گذشته در همين تاپيک درخواست نمودم که بحث را از پست 37# مجددا پي بگيريم تا تعريف عملي دقيقتري نسبت به تعيين لايه ها در يک پروژه کاربردي دست دهد که متاسفانه اين پست من توسط مديريت محترم حذف گرديد .
من فکر میکنم هدف این تاپیک نیز همین است .تعريف عملي دقيقتري نسبت به تعيين لايه ها در يک پروژه کاربردي دست دهد که متاسفانه اين پست من توسط مديريت محترم حذف گرديد .
من فقط مشکلی که هنوز میبینم ما بایستی ابتدا نسخه مورد استفاده در framework را تعیین کنیم بعد به سراغ layering بریم .
مثلا linq لایه بندی را تغییر داد .
من آماده همکاری فنی در این زمینه هستم فقط میگم قبلش مشخص بشه با Ds قرار کار بشه یا linq یا ا custome collection ها و یا تحت معماری NHibernate یا ... است . بعد شروع کنیم .
و به نظر من خیلی احمقانه است ما لایه بندی را در این 3 لایه فقط ببینیم.
کسی از دوستان به تاثیر لایه بندی بر روی coupling اشاره نکرد. معمولا لایه ها را طوری در نظر می گیرند که کلاس های لایه های پایین هیچ اطلاعی درباره ی کلاس های استفاده کننده در لایه های بالاتر ندارند.
دوستان قرار نیست از اول یه معماری خیلی قدرتمند طراحی کنیم...
می خوایم پله پله بریم بالا...
بزارید یه شمه ی کاملی از پروژه آماده بشه، تا یه جای خوبی پیش بره، بعد کم کم به نواقصش می پردازیم و اونها رو برطرف می کنیم...
اگر هر کسی بیاد و یه معماری قدرتمند مطرح کنه، دیگه اساس موضوع تاپیک از طرح خارج میشه، چرا که هر طرحی مزایا و معایب خودش رو داره...
پس بزارید روی همون روالی که iroonidotnet شروع کرده تمرکز کنیم و با همون روند پیش بریم تا کم کم اون رو ارتقاء بدیم و نواقصش رو رفع کنیم نه که از اول به همه فرض ها هجوم ببریم که این اشتباهه و فلانه و بیسار...
با تشکر
دوست عزيز
من هم معتقدم که بايد بحث از يک روال مشخص تبعيت کنه ولي نظر من اين است که اول بايد به نحوه طراحي معماري و تعريف لايه ها به خوبي پرداخته شود و پس از آن به سراغ کد نويسي برويم چرا که :
خشت اول گر نهد معمار کج
تا ثريا مي رود ديوار کج
به هر حال اينم نظر منه ...
سلام
می خواستم بدونم که اعمالی مثل Transaction رو در کد.م لایه باید پیاده سازی کرد و چطور به کاربر
اطلاع بدیم؟؟؟؟
با تشکر
Transaction چون جزء فعاليت هاي DB است بايستي در DataLayer مديريت شود
اطلاعات Master و Detail بايستي به DataLayerجهت درج Transactional پاس شود
البته به جای اعمال TransAction در DAL میشه تمام TransAction ها رو به Database فرستاد و در سمت Database اونها رو مدیریت کنیم !Transaction چون جزء فعاليت هاي DB است بايستي در DataLayer مديريت شود
اطلاعات Master و Detail بايستي به DataLayerجهت درج Transactional پاس شود
خواستن ، توانتستن است !!!
همانطور که می دانیید،هر فرم بصورت پیش فرض چند فایل به نام های:
Form1.Designer.cs Form1.resx Form1.csمورد بحث من Reversi.Designer.cs می باشد.
آیا استفاده از نام دامنه های
در این فایل جهت ساختن اجزای گرافیکی فرم،جزو قوانین چند لایه ای می باشد یا خیر؟
System.Windows.Forms
- System.Drawing
- System.Data
یعنی ما مجازیم توابع ای که کار ساختن گرافیک برنامه را دارند، در این فایل پیاده سازی کنیم ؟
ممنون،
خیر جزو قوانین چند لایه ای نمی باشد.برای کسی که بیشتر با asp.net کار کرده است.شاید این ابهام پیش بیاید که در win32 هم اینگونه است.ولی وقتی با خطای load فرم مواجه می شوید،این شبه برطرف می شود.نمی دانم شاید این یکی از مشکلات win32 در پیاده سازی چند لایه ای بوده است.
به هر حال با جایگزین شدن xaml چند لایه ای شدن مفهوم بهتری را گرفته است.
پیروز باشید.
با سلام خدمت دوستان عزیز
در برنامه نویسی ساخته یافته من برای اینکه یک textbox را Bindکنم از کد زیر استفاده میکردم(این کار را برای وقتی که می خواستم که وقتی کاربر بر روی یک رکورد در datagrid کلیک میکرد اطلاعات آن در textbox ها هم نشون داده بشه انجام میدادم)
TextBox1.DataBindings.Add(New Binding("text", dv, "id_a"))
الان که دارم برنامه نویسی 3 لایه کار میکنم فکر کنم باید این کد را در لایهDAL قرار دهم ولی اینجا این مشکل است چون لایه DAL من از نوعClassLibrary است واصلاً من در لایه DAL خودم نباید با اشیا لایهUI کار کنم این کد را چگونه و کجا بنویسم
با تشکر فراوان
نمیدونم روی روند تاپیک تاثیر مثبت میزاره یا منفی.
با توجه به هدف کد پست 74
TextBox1.DataBindings.Add("Text", DataGrid1.DataSource, DataGrid1.Columns[0].Name );
کد فوق رو تست نکردم اگه جواب نداد باید Interface مورد نظر (الان حضور ذهن ندارم) رو تو listپیاده سازی کنی.
اگه از linq استفاده میکنی که binding راحت تره...
یه نمونه از معماری 3لایه رو که بر پایه list پیاده سازی شده رو میزارم که بشه Performance با نمونه dataset ی مقایسه کرد ....
البته در روز های آتی سعی میکنم کامل ترش کنم.
- ساخت لایه دسترسی به داده ها (Data Access Layer)
- ساخت لایه تعریف داده ها (Common Data Definition)
- لایه نمای کاربر (Presentation)
- لایه قوانین سیستم (Business Rules)
توی لیست درسای آقای کرامتی بود
درباره دومی میشه توضیح بدید