PDA

View Full Version : برنامه‌نویسی چند لایه (Multi Tier)



babak_delphi
شنبه 18 اسفند 1386, 13:54 عصر
در مورد این مبحث مطالبی در سایت وجود داره که اکثراً یا در محدوده زبانهایی غیر از دلفی بحث شده یا فقط در مورد مسائل تئوری برنامه نویسی چندلایه بحث شده
به همین دلیل من با اجازه این تاپیک رو ایجاد کردم تا انشاالله در مورد مسائل مهمی در حوزه Multi tire که قبلا یا بحث نشده یا به نتیجه نرسیده در اینجا بحث بشه

خیلی ها در مورد مباحث تئوریک برنامه نویسی چند لایه اطلاعاتی دارند
ولی در مورد نحوه پیاده سازی عملی فکر میکنم خیلی کمترند افرادی که بلدند
من خودم در مورد تئوریش چیزهایی می دونم
تو همین سایت هم مطالبی هرچند اندک نوشتم
ولی در مورد نحوه پیاده سازی عملیش چیز خاصی نمی دونم
بخصوص لایه میانی
مثلا کدهای SQL رو کجا مینویسیم؟
مثلا یک فرم داریم ، یک سری اطلاعات رو از طریق Edit ها از کاربر میگیریم
با توجه به اونها ، کدٍ SQL رو ایجاد میکنیم و در قسمت SQL از ADOQuery (مثلا) قرار میدیم و بعد Open میکنیم
خب حالا اگه برنامه سه لایه باشه باید چیکار کرد؟
تا جایی که من اطلاع دارم اینجور کدها در لایه Presentation قرار نمیگیرن و در لایه Bisines نوشته میشن
حالا چطور نمیدونم و فکر میکنم اکثر کسانی که در مورد Multi Tire سوال یا مشکل دارن اگه مشکل اصلیشون هم این نباشه (که بعید میدونم) حداقل تو این قسمت هم مشکل دارند
حالا اساتید محترم اگه لطف کنند و در این مورد توضیحات بیشتری بدن و این تاپیک رو به سرانجام برسونند به خیلی ها کمک میکنند
با تشکر کارچینی.

mrm0101
شنبه 18 اسفند 1386, 14:11 عصر
بسمه تعالی
مراحل ایجاد یک برنامه clint/server با استفاده از برنامه نویسی سه لایه (Multi Tire)


برای استفاده از بانکهای اطلاعاتی در شبکه چندین راه وجود دارد

1- استفاده از adoconnection و استفاده از کلمه عبور و رمز و ای پی سرور و ...
2- استفاده از برنامه های چند لایه

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

در این مثال از datasnap و بانک اطلاعاتی اس کیو ال سرور استفاده شده است .

الف : برنامه سرور
1-یک پروژه جدید باز کنید و با عنوان سرور ذخیره نمایید
2- به قسمت file / new / other/multitier رفته و بر روی remote data server کلیک نمایید
3- حال یک پنجره با عنوان remote data module wizard ایجاد می شود که در قسمت CoClass Name یک نام برای سرور انتخاب نمایید . و به قسمتهای دیگر کاری نداشته باشید و ok را بزنید .
4- بلافاصله یک datamodule جدید با نام سرور (نامی که در قسمت class name انتخاب نمودید ) ایجاد می شود .
5- حال با استفاده از ado یا bde یا ... به با نک اطلاعاتی وصل شوید . مثلا با adoquery به یک جدول از یک بانک اطلاعاتی sql server وصل شده . حال adoqueryr را فعال سازید تا ارتباط برقرار شود . در پنجره مشخصات adoquery خاصیت active را true نمایید .
6- در قسمت dataacess یک DataSetProvider1 را بر روی datamoule که ایجاد کرده ایم قرار می دهیم و روی dataset در پنجره مشخصات کلیک نموده تا نام ارتباط بانک اطلاعاتی نمایان شود ( adoquer در مثال بالا)
7- پس از اطمینال از اتصال صحیح با نک اطلاعاتی پروژه را ذخیره و یک بار اجرا نمایید تا سرور در شبکه ثبت شود .
8- توجه داشته باشید که برنامه سرور فقط محل نگهداری بانک اطلاعاتی و کنترل اتصالات و کاربران است . پس کار دیگری را انجام نمی دهیم و حال فایل اجرایی برنامه سرور را اجرا می کنم.

ب نوشتن برنامه کلاینت
1- یک پروژه جدید با عنوان کلاینت ایجاد نموده و ذخیره نمایید .
2- در روی فرم از قسمت datasnap یک SocketConnection1 را روی فرم قرار داه . در قسمت adress نام ip کامپیوتر سرور را وارد نمایید.(مثلا ip سرور در برنامه محل کار من 10.20.1.93 است ) . اگر ای پی سرور را نمی دانید می توانید نام کامپیوتر سرور را وارد کنید .حال در قسمت servername نام سروری را که در برنامه سرور ثبت کرده اید را انتخاب نمایید . اگه پیام خطا داده احتمالا در تنظیمات شبکه یا خود شبکه ایراد است . وقتی نام سرور را نتخاب کردید گزینه conecct از مشخصات SocketConnection1 vh را true کنید . اگر true شد یعنی ارتنباط با سرور بر قرا است .
3- حال در قسمت datascess یک ClientDataSet1 بر روی فرم قرار داده و تنظیمات زیر را انجام دهید
A: در قسمت remote server کلیک نمایید تا نام socketConnection1 ظاهر شود .
b: در قسمت provider name کلیک کنید تا نام DataSetProvider1 ظاهر شود
c:حال خاصیت active را true کنید .
4- حال از قسمت dataascess یک datasource1 بر روی فرم قرار دهید و خاصیت datadet آن را با نام clientdataset1ظاهر شود .
5- حال از قسمت data control یک datagrid روی فرم قرار داده و خاصیت datasource آن رو datasource 1 انتخاب کنید . می بینید که اطلاعات سرور نمایش داده می شود .

توضیحات . چون ما از SocketConnection2 استفاده می کنیدم که بر اساس tcp/ip عمل می کنید (پشتیبانی سوکت ها ) باید برنامه فعال سوکت ها فعال شود . برای این کار مرحل زیر را انجام دهید
1- در قسمت run ویندوز دستور cmd را تایپ نمایید .
2- پس از ورود به محیط cmd دستور مقابل را تایپ نمایید scktsrvr - install .

توضیح 2 : فرض بر این است که کلیه خوانندگان عزیز با بانک اطلاعتی و ارتباط با ان آشنایی دارند . اگر می خواهید به نتیجه برسید نامگذاری اشیاعی که بر روی فرم ها و ... می گذارید عین مثال باشد .
امیدوارم مورد استفاده قرار گرفته باشد .
با تشکر
محمد رضا جهانی

babak_delphi
شنبه 18 اسفند 1386, 14:33 عصر
لطفا در مورد لایه میانی و کدهایی که در اون نوشته میشه توضیح بدین
در مورد نحوه ایجاد برنامه های multi tire در کتابها هم نوشته شده
لطفا در مورد کدهایی که در لایه میانی نوشته میشه و تفاوت برنامه Client در برنامه های Client/Server و Multi tire توضیح بدین و اینکه کدها بخصوص کدهای SQL چطور و کجا نوشته میشن

mrm0101
شنبه 18 اسفند 1386, 15:51 عصر
سلام . شما لطف کنید بگید پروژه شما چی هست و می خواهید چکار کنید و اصلا چه نیازی دارید از سه لایه ای استفاده کنید .

برنامه سرور واسطه بین برنامه کلاینت و بانک اطلاعاتی است . یعنی کنترل بیشتر بر کلاینت ها

برای نوشتن دستورات اس کیو ال در کلاینت ها ابتدا شما باید در سرو.ر در dataprovider در قسمت option مجوز ویرایش یا حذف و افزدون و ... رکورد را به کلاینت ها بدید (با true کردن گزینه های مورد نظر )و سپس در قسمت کلاینت در command text دستورات اس کیو ال سرا وارد کنید .

باز تاکید می کنم بسته به نوع دستوری که می خواهید بنویسید باید حتما در سرور مجوز این نوع دستور داده شده باشد
نکته مهم . وقتی می خواهید از دستورات اس کیو ال سافتاده کنید در سمت سرور علاوه بر وجود مجوز در dataprovider باید دیتا ست شما (adoquery) حتما بسته باشد
(adoquery.active= false)
موفق باشید

delphiprog3000
شنبه 18 اسفند 1386, 16:05 عصر
سلام با اجازه دوستان.

من یه پروژه با چند لایه درست کردم که برای شروع پیشنهاد میکنم این مقاله رو مطالعه کنید چیزهای زیادی دستگیرتون میشه.


http://barnamenevis.org/forum/showthread.php?t=59232


همین جور که دوستمون هم توضیح داد.

لایه اولیه که همان ارتباط سرور میباشد. که از connection برای ارتباط با دیتابیس استفاده میشود که به همراه آن از اشیای مثل Adodataset ها و Provider ها استفاده میشود.

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

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

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

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

به امید موفقیت همه شما......

babak_delphi
شنبه 18 اسفند 1386, 18:56 عصر
باز هم سوالم رو تکرار میکنم
من تئوریِ Multi Tire رو تا حدودی بلدم
سوالم اینه :
تا جایی که من اطلاع دارم(از روی مطالبی که تو همین سایت خوندم) دستورات SQL در سمت Client نوشته نمی شوند
می خواهم بدونم که این دستورات رو چطوری در لایه میانی باید نوشت
با توجه به این که معمولا متن دستور SQL از قبل بطور دقیق معلوم نیست و با توجه به درخواست کاربر مشخص و تکمیل می شوند (مثلا در فرم جستجو که با توجه به این که کاربر محدوده مورد نظر برای کدام فیلد ها را وارد کرده باشد ، در دستور SQL ای که ساخته میشه در قسمت Where ممکنه 0 تا n فیلد وجود داشته باشه)
خب حالا تکلیف این کدهای SQL ای که بصورت دینامیک تولید میشن چیه
چون در لایه Presentation مشخص میشه که چطور باید باشن ولی در Multi Tire گفته میشه که این کدها باید در لایه Bisines باشند.

vcldeveloper
شنبه 18 اسفند 1386, 20:56 عصر
خب حالا تکلیف این کدهای SQL ای که بصورت دینامیک تولید میشن چیه
کلاینت هر درخواستی داشته باشه، اونو برای Application Server ارسال میکنه. Application Server براساس درخواست دریافت شده کد SQL مورد نیاز را تولید میکنه و به بانک اطلاعاتی می فرسته. وقتی نتیجه از بانک اطلاعاتی برپشت داده شد، از طریق Application Server به کلاینت ارسال میشه. در معماری DataSnap که دلفی ارائه میکنه، این نقش را ClientDataSet در سمت کلاینت و DataSetProvider در سمت Application Server برعهده می گیرند.

babak_delphi
شنبه 18 اسفند 1386, 21:08 عصر
اگر بخواهیم کدی مثل این را داشته باشیم باید چه کاری انجام بدهیم

'select * from Table1 where fld1 = '+edit1.text+' and fld2 = ' + edit2.text + ' and fld4 = ''' + edit4.text + ''''
این کد رو چطوری باید بسازیم که در لایه Presentation هیچ کد SQL نداشته باشیم؟

mrm0101
شنبه 18 اسفند 1386, 22:47 عصر
سلام
من عرض کردم خدمتتون شما در ClientDataSet یک ایتم داره بنام commantext که شما دستورات اس کیو ال رو درون اون می نویسید




ClientDataSet1.Close;
ClientDataSet1.CommandText:='select * from login where username ='+QuotedStr(edit1.text) +' and password = '+QuotedStr(edit2.text );
ClientDataSet1.Open;
if ClientDataSet1.RecordCount=0 then
MessageBox(Handle,'هیچ موردی پیدا نشد ','äÑã ÇÝÒÇÑ ÈÇÒÑÓí ',MB_OK+MB_RIGHT+MB_ICONINFORMATION );

vcldeveloper
یک شنبه 19 اسفند 1386, 02:01 صبح
این کد رو چطوری باید بسازیم که در لایه Presentation هیچ کد SQL نداشته باشیم؟
توی DataSnap لایه Application Server شما یک کلاس در اختیار Client میزاره که حداقلش باید اینترفیس IAppServer را پیاده سازی کرده باشه (دلفی خودش براتون انجام میده)، شما می تونید به این کلاس متدهای مورد نظر خودتون رو اضافه کنید. Client میتونه این متدها را فراخوانی کنه و بهشون پارامتر بده. سرور هم میتونه بر اساس متد فراخوانی شده و مقادیر پارامترهای ارسال شده عملی رو انجام بده، مثلا یک کوئری از بانک بگیره، و نتیجه رو برای کلاینت ارسال کنه.
یک راهش هم اینه که مستقیما کوئری را از طریق کلاینت ارسال کنید (مثل پست 9# همین تاپیک) که در این صورت عینا همین کوئری در سمت Application Server روی بانک اجرا میشه. این روش در اکثر موارد روش جالبی نیست، چون دارید از یک معماری سه لایه استفاده دو لایه می کنید؛ در واقع بود و نبود Application Server در عمل نقشی در کار نخواهد داشت، چون کوئری مستقیما از Client روی بانک اطلاعاتی اجرا میشه.

mzjahromi
یک شنبه 19 اسفند 1386, 07:14 صبح
من سعی میکنم اگه وقتم اجازه بده مراحل ساخت یک برنامه نمونه کلاینت سرور رو در یک تاپیک جداگانه به صورت مرحله به مرحله توضیح بدم

hr110
یک شنبه 19 اسفند 1386, 08:11 صبح
من سعی میکنم اگه وقتم اجازه بده مراحل ساخت یک برنامه نمونه کلاینت سرور رو در یک تاپیک جداگانه به صورت مرحله به مرحله توضیح بدم

لطفا در و.ی.ک.... انجام شود، متشکرم.

delphiprog3000
یک شنبه 19 اسفند 1386, 12:46 عصر
سلام با اجازه اساتید محترم.

میخواستم اگه امکان داره جناب کشاورز و یا اساتید محترم برای کامل کردن این تاپیک یک مثال هم بیارن.

البته با تشکر.......

babak_delphi
یک شنبه 19 اسفند 1386, 14:56 عصر
آقای کشاورز از لطفتون ممنون
الان دیدم نسبت به این مساله خیلی بهتر شد
البته به قول دوستمون :


میخواستم اگه امکان داره جناب کشاورز و یا اساتید محترم برای کامل کردن این تاپیک یک مثال هم بیارن.

البته با تشکر.......

vcldeveloper
یک شنبه 19 اسفند 1386, 17:18 عصر
میخواستم اگه امکان داره برای کامل کردن این تاپیک یک مثال هم بیارن.Creating multi-tier information systems using MIDAS (http://dn.codegear.com/article/20568)

فقط بگم که MIDAS = DataSnap

حمیدرضاصادقیان
یک شنبه 19 اسفند 1386, 20:03 عصر
اینم یک نمونه که کامل در این زمینه توضیح داده.

babak_delphi
دوشنبه 20 اسفند 1386, 00:55 صبح
از آقایان کشاورز و صادقیان خیلی ممنونم
فوق العاده بود

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

mmds
سه شنبه 03 آذر 1388, 12:55 عصر
سلام
راستشو بخواید چند لایه طوری که در بالا بحث شد نیست.نسبتا گسترده است ما داریم یه برنامه تحت وب می نوسیم که خیلی بزرگه و واسه یه شبکه محلی هستش .ولی زبانش C# هستش .شما حتما باید لایه واسط رو بنویسید آنم کامل .
شرمنده بیشتر از این وقت نیست چون باید برگردم سر پروژه
بای

جواد ملاولی
سه شنبه 24 آذر 1388, 11:27 صبح
سلام. هر چند این تاپیک مال دو سال پیشه ولی یه سوال داشتم: آیا برنامه نویسی چند لایه فقط برای وقتیه که برنامه ی ما تحت شبکه است؟

vcldeveloper
سه شنبه 24 آذر 1388, 15:00 عصر
آیا برنامه نویسی چند لایه فقط برای وقتیه که برنامه ی ما تحت شبکه است؟
نه لزوما، یک برنامه میتونه چند لایه باشه، و لایه های آن بصورت برنامه های مستقل در یک سیستم در حال اجرا باشند؛ یا یک برنامه طراحی چند لایه داشته باشه، و همه لایه های آن در یک برنامه وجود داشته باشند، ولی به این صورت طراحی شده باشه که بعدا اگر برنامه گسترش پیدا کرد، بشه لایه های آن را راحتر از هم جدا کرد و در برنامه ها یا سیستم های مختلف پخش کرد.

mahdy.asia
جمعه 19 آذر 1389, 19:53 عصر
بسمه تعالی
مراحل ایجاد یک برنامه clint/server با استفاده از برنامه نویسی سه لایه (Multi Tire)


برای استفاده از بانکهای اطلاعاتی در شبکه چندین راه وجود دارد

1- استفاده از adoconnection و استفاده از کلمه عبور و رمز و ای پی سرور و ...
2- استفاده از برنامه های چند لایه

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

در این مثال از datasnap و بانک اطلاعاتی اس کیو ال سرور استفاده شده است .

الف : برنامه سرور
1-یک پروژه جدید باز کنید و با عنوان سرور ذخیره نمایید
2- به قسمت file / new / other/multitier رفته و بر روی remote data server کلیک نمایید
3- حال یک پنجره با عنوان remote data module wizard ایجاد می شود که در قسمت CoClass Name یک نام برای سرور انتخاب نمایید . و به قسمتهای دیگر کاری نداشته باشید و ok را بزنید .
4- بلافاصله یک datamodule جدید با نام سرور (نامی که در قسمت class name انتخاب نمودید ) ایجاد می شود .
5- حال با استفاده از ado یا bde یا ... به با نک اطلاعاتی وصل شوید . مثلا با adoquery به یک جدول از یک بانک اطلاعاتی sql server وصل شده . حال adoqueryr را فعال سازید تا ارتباط برقرار شود . در پنجره مشخصات adoquery خاصیت active را true نمایید .
6- در قسمت dataacess یک DataSetProvider1 را بر روی datamoule که ایجاد کرده ایم قرار می دهیم و روی dataset در پنجره مشخصات کلیک نموده تا نام ارتباط بانک اطلاعاتی نمایان شود ( adoquer در مثال بالا)
7- پس از اطمینال از اتصال صحیح با نک اطلاعاتی پروژه را ذخیره و یک بار اجرا نمایید تا سرور در شبکه ثبت شود .
8- توجه داشته باشید که برنامه سرور فقط محل نگهداری بانک اطلاعاتی و کنترل اتصالات و کاربران است . پس کار دیگری را انجام نمی دهیم و حال فایل اجرایی برنامه سرور را اجرا می کنم.

ب نوشتن برنامه کلاینت
1- یک پروژه جدید با عنوان کلاینت ایجاد نموده و ذخیره نمایید .
2- در روی فرم از قسمت datasnap یک SocketConnection1 را روی فرم قرار داه . در قسمت adress نام ip کامپیوتر سرور را وارد نمایید.(مثلا ip سرور در برنامه محل کار من 10.20.1.93 است ) . اگر ای پی سرور را نمی دانید می توانید نام کامپیوتر سرور را وارد کنید .حال در قسمت servername نام سروری را که در برنامه سرور ثبت کرده اید را انتخاب نمایید . اگه پیام خطا داده احتمالا در تنظیمات شبکه یا خود شبکه ایراد است . وقتی نام سرور را نتخاب کردید گزینه conecct از مشخصات SocketConnection1 vh را true کنید . اگر true شد یعنی ارتنباط با سرور بر قرا است .
3- حال در قسمت datascess یک ClientDataSet1 بر روی فرم قرار داده و تنظیمات زیر را انجام دهید
A: در قسمت remote server کلیک نمایید تا نام socketConnection1 ظاهر شود .
b: در قسمت provider name کلیک کنید تا نام DataSetProvider1 ظاهر شود
c:حال خاصیت active را true کنید .
4- حال از قسمت dataascess یک datasource1 بر روی فرم قرار دهید و خاصیت datadet آن را با نام clientdataset1ظاهر شود .
5- حال از قسمت data control یک datagrid روی فرم قرار داده و خاصیت datasource آن رو datasource 1 انتخاب کنید . می بینید که اطلاعات سرور نمایش داده می شود .

توضیحات . چون ما از SocketConnection2 استفاده می کنیدم که بر اساس tcp/ip عمل می کنید (پشتیبانی سوکت ها ) باید برنامه فعال سوکت ها فعال شود . برای این کار مرحل زیر را انجام دهید
1- در قسمت run ویندوز دستور cmd را تایپ نمایید .
2- پس از ورود به محیط cmd دستور مقابل را تایپ نمایید scktsrvr - install .

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

mahdy.asia
جمعه 19 آذر 1389, 20:29 عصر
من دو تا پروسیجر در اسکیوال دارم که می بایست با پارامترهایی که از داخل برنامه می گیرد اجرا شود در این روش نام پروسیجر را در کدام لایه می بایست تنظیم کنم و چطور به برنامه اعلام کنم اکنون پروسیجر 1 را با پارمترهای a,b اجرا کن

bormohsen
پنج شنبه 21 بهمن 1389, 01:30 صبح
یک کتاب خوب برای اولین بار در کشور چاپ شده که در آن برنامه نویسی سه لایه را توضیح داده. ضمنا یک پروژه بزرگ هم تویی این کتاب هستش که به صورت سه لایه پیاده سازی شده است. برای خواندن بخشی از کتاب و خرید می توانید به سایت WWW.HOWPRG.com (http://www.HOWPRG.com) مراجعه کنید