PDA

View Full Version : مشکلات در پیاده سازی معماری سه لایه



website.expert
دوشنبه 11 دی 1391, 15:39 عصر
با سلام،
من برای اولین بار یه پروژه سه لایه طبق آموزش تاپیک زیر که جناب mohsen_f_b (http://barnamenevis.org/member.php?23619-mohsen_f_b) عزیز زحمتش رو کشیده بود ایجاد کردم.
http://barnamenevis.org/showthread.php?341260-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Entity-Framework-%D8%AF%D8%B1-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-3-%D9%84%D8%A7%DB%8C%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-%D8%B9%D9%85%D9%84%DB%8C
تک تک کدهاشو خودم نوشتم بدون اینکه copy/paste کنم :خجالت: و کاملاً هم بدون هیچ خطایی جواب میده.
البته بگذریم از اینکه بعضی کدهای قسمت bllش رو متوجه نشدم.:لبخند:
به تمامی دوستان هم پیشنهاد میکنم،برای start یادگیری این سبک برنامه نویسی واقعاً عالیه.:تشویق:
حالا قصد دارم شروع به ساخت یه سایت با معماری سه لایه کنم.و سوالهای زیادی برام ایجاد شده:
اولیش اینه:
تو این آموزش برای هر عملی مثل: Insert Update Delete Select یک استور پروسیجر در پایگاه داده نوشته شده.
آیا این روش برای پروژه های بزرگ هم میشه استفاده کرد؟!
یعنی برای هر تیبلی،هر عملی یک استور پروسیجر نوشته شود!
میخواستم بدونم بهترین راه انجام عملیات در پایگاه داده چیه؟!
هم سرعت عملیات،هم کدنویسی کمتر،هم اصولی بودنش مد نظرمه.
ممنون میشم اساتید عزیز که در این زمینه تجربه دارن راهنمایی بفرماین.
با تشکر/

fakhravari
دوشنبه 11 دی 1391, 20:13 عصر
معماری سه لایه

هر چنتا لایه فرقی نداره.
اینها معماری نیستند در کل یک راه کلاس بندی که باعث بهینه شدن کد ها میشن.
تعداد لایه ها هم بیشتر باشه باعث سنگین تر شدن پروژه و تحلیل آن میشود.
در کل میتوان با 2 کلاس پروژه ها را تمام کرد.

website.expert
دوشنبه 11 دی 1391, 21:52 عصر
ممنون از پاسختون،
من قبلاً با vb کار میکردم الان تازه اومدم سراغ وب.
الان تقریباً میتونم با شیء گرایی و کلاس پروژه هام رو درست کنم.
ولی دوست داشتم که یاد بگیرم.
واسه پروژه ی های بزرگ فکر کنم خیلی حیاتی باشه،این طور نیست؟!
یعنی ارزش یادگیری رو نداره؟!

fakhravari
دوشنبه 11 دی 1391, 23:36 عصر
خب اگر نتونید این کلاس بندی رو پیاده کنید یعنی از تحلیل رنامه و کد نویسی هیچی نمیدونید و در نتیجه هیچ بازدهی ندارید

RED-C0DE
چهارشنبه 20 دی 1391, 23:04 عصر
هر چنتا لایه فرقی نداره.
اینها معماری نیستند در کل یک راه کلاس بندی که باعث بهینه شدن کد ها میشن.
تعداد لایه ها هم بیشتر باشه باعث سنگین تر شدن پروژه و تحلیل آن میشود.
در کل میتوان با 2 کلاس پروژه ها را تمام کرد.

جالبه در نوع خودش!

website.expert
پنج شنبه 21 دی 1391, 08:11 صبح
جالبه در نوع خودش!

ببخشید منظورتون چیه؟
میشه بیشتر توضیح بدی؟!

Saber_Fatholahi
پنج شنبه 21 دی 1391, 09:05 صبح
ممنون از پاسختون،
من قبلاً با vb کار میکردم الان تازه اومدم سراغ وب.
الان تقریباً میتونم با شیء گرایی و کلاس پروژه هام رو درست کنم.
ولی دوست داشتم که یاد بگیرم.
واسه پروژه ی های بزرگ فکر کنم خیلی حیاتی باشه،این طور نیست؟!
یعنی ارزش یادگیری رو نداره؟!
سلام دوست من لایه دیتا شما می تونی از هر چیزی استفاده کنی حتما که نباید SP باشه همش اجباری نیست شما می تونی در لایه DAL از Entity Framwork یا NH استفاده کنی
در کل کارش زمانبر هست اما ارزش داره منم یه پروژه اوپن سورس توسعه دادم توی همین سایتم هست توی سایت وحید نصیری هم قرار دادم کاملتره می تونی ازشون ایده بگیری، البته به صورت providerBase پیاده سازی شده، واینکه میگن سه لایه منظور جدا سازی منطق های اونه حتما نباید کدهات توی پروژه های جدا باشن بعدهم بهش بگین لایه، همه کد ها می تونه توی یک فایل باشه اما اون منطق رعایت کنه میشه سه لایه

موفق وموید باشید

website.expert
پنج شنبه 21 دی 1391, 10:36 صبح
سلام دوست من لایه دیتا شما می تونی از هر چیزی استفاده کنی حتما که نباید SP باشه همش اجباری نیست شما می تونی در لایه DAL از Entity Framwork یا NH استفاده کنی
در کل کارش زمانبر هست اما ارزش داره منم یه پروژه اوپن سورس توسعه دادم توی همین سایتم هست توی سایت وحید نصیری هم قرار دادم کاملتره می تونی ازشون ایده بگیری، البته به صورت providerBase پیاده سازی شده، واینکه میگن سه لایه منظور جدا سازی منطق های اونه حتما نباید کدهات توی پروژه های جدا باشن بعدهم بهش بگین لایه، همه کد ها می تونه توی یک فایل باشه اما اون منطق رعایت کنه میشه سه لایه

موفق وموید باشید


با سلام،ممنون از راهنماییتون.
فقط یه چند تا سوال و نکته:
1- NH چیه؟
2- در مورد لایه ها کلاً تو پروژه های جدا باشه بهتره یا که نه؟!
خودم فکر کنم از منطقش پیروی کنم و تو یه پروژه انجام بدم بهتره!یه مقدار توضیح بدید ممنون میشم.
سرچ کردم تو این لینک : www.payawebshomal.com/ProjectDetails.aspx?ProjectID=9 (http://barnamenevis.org/www.payawebshomal.com/ProjectDetails.aspx?ProjectID=9) پروژتون رو پیدا و دانلود کردم،دارم نگاه میکنم 100% برای من که تازه کار هستم مفید خواهد بود.
خواستم تشکر کنم از لطفتون.
اگه سوالی در مورد پروژتون برام پیش اومد میتونم بپرسم دیگه؟!:خجالت:
باز هم ممنون و متشکر.

AmirGhasemi
پنج شنبه 21 دی 1391, 10:44 صبح
سلام
با تمام احترامي كه براي آقاي فخرآئري قائلم منتهي با حرف ايشان مبني بر اينكه اين روش معماري نيست كاملا مخالفم
در ضمن در پروژه هاي بزرگ شما فقط و فقط و بايد و بايد از معماري هاي چند لايه استفاده كني
حالا مي خواهم بگويم كه نه تنها سه لايه ديگه كفاف نمي ده بلكه برنامه نويسان مدتهاست كه دنبال 5 لايه هستند

Fartaj
پنج شنبه 21 دی 1391, 11:22 صبح
سلام

اگر قرار باشه از پروسجر استفاده بشه باید پروسجر رو انعطاف پذیر بنویسید و سعی کنید که مواردی که امکان تغییر هست رو با پارامتر بفرستید با این کار برای هر عملیات یک پروسجر بزارید و برای هر جدول نام همون جدول رو بفرستید به پروسجر

website.expert
پنج شنبه 21 دی 1391, 12:44 عصر
سلام

اگر قرار باشه از پروسجر استفاده بشه باید پروسجر رو انعطاف پذیر بنویسید و سعی کنید که مواردی که امکان تغییر هست رو با پارامتر بفرستید با این کار برای هر عملیات یک پروسجر بزارید و برای هر جدول نام همون جدول رو بفرستید به پروسجر

ممنون میشم اگه یه نمونه SP که انعطاف پذیر باشه برام مثال بزنید.

website.expert
پنج شنبه 21 دی 1391, 12:46 عصر
سلام
با تمام احترامي كه براي آقاي فخرآئري قائلم منتهي با حرف ايشان مبني بر اينكه اين روش معماري نيست كاملا مخالفم
در ضمن در پروژه هاي بزرگ شما فقط و فقط و بايد و بايد از معماري هاي چند لايه استفاده كني
حالا مي خواهم بگويم كه نه تنها سه لايه ديگه كفاف نمي ده بلكه برنامه نويسان مدتهاست كه دنبال 5 لايه هستند

میشه توضیح بدید که مزیت های لایه های بیشتر چیه دوست عزیز؟
آیا این کار باعث افزایش کد نویسی و پیچیده تر شدن نمیشه؟!

Fartaj
پنج شنبه 21 دی 1391, 13:19 عصر
ممنون میشم اگه یه نمونه SP که انعطاف پذیر باشه برام مثال بزنید.

اگر این پروسجر رو در نظر بگیرید :


create PROCEDURE dbo.ImportToTable
(
@TableName nvarchar(100),
@que_id int ,
@sub_code int,
@chap_no int,
@que nvarchar(max),
@opt1 nvarchar(max),
@opt2 nvarchar(max),
@opt3 nvarchar(max)

)
AS
insert into @tablename (que_id,sub_code,chap_no,que,opt1,opt2,opt3) values(@que_id,@sub_code,@chap_no,@que,@opt1,@opt2 ,@opt3)
RETURN


تو این پروسجر به غیر از مقادیری که دریافت می کنه نام جدول رو هم به صورت پارامتر دریافت می کنه ( tablename@ ) . حالا شما فرض کنید دو تا جدول دارید با فیلدهای متفاوت و برای اینها می خواهید پروسجر در نظر بگیرید خوب برای این کار یک پروسجر برای ثبت اطلاعات در نظر می گیرید که 2 تا پارامتر دریافت می کنه یکی نام جدول و دیگری نام فیلد و مقدار اون که باید به صورت آرایه ارسال بشه در مورد insert یک مقدار کد می خواد اما برای select می تونید یک پروسجر در نظر بگیرید و نام جدول رو با پارامتر بفرستید .

website.expert
پنج شنبه 21 دی 1391, 13:55 عصر
ممنون دوست عزیز،

تو این پروسجر به غیر از مقادیری که دریافت می کنه نام جدول رو هم به صورت پارامتر دریافت می کنه ( tablename@ ) .
تا اینجاش رو متوجه شدم.

حالا شما فرض کنید دو تا جدول دارید با فیلدهای متفاوت و برای اینها می خواهید پروسجر در نظر بگیرید خوب برای این کار یک پروسجر برای ثبت اطلاعات در نظر می گیرید که 2 تا پارامتر دریافت می کنه یکی نام جدول و دیگری نام فیلد و مقدار اون که باید به صورت آرایه ارسال بشه
ولی تو نوشتن این sp مشکل دارم نمیدونم چجوری یک آرایه رو ثبت کنم.
دقیقاً آرایه باید به چه صورت باشه؟دوبعدی؟یا اینکه یه بعدی(یکی در میون فیلد و مقدار)؟
میشه یه مقدار بیشتر توضیح بدید؟
ممنون.

Fartaj
پنج شنبه 21 دی 1391, 20:13 عصر
ببینید شما وقتی یک آرایه تعریف می کنید اون آرایه یک کلید داره یک محتوا که اون کلید می شه نام فلید و مقدارش می شه مقدار فیلد اما به اینصورت نمی شه ازش استفاده کرد باید کلیدهای این آرایه رو بریزیم تو یک آرایه دیگه مثلا به نام ( fields ) و مقادیر اون رو بریزیم تو یک آرایه دیگه مثلا (values) البته این کار رو باید با حلقه انجام بدی حلقه foreach بعد از این کار باید بین مقادیر آرایه از یک جدا کننده استفاده کنیم و اون رو بریزیم تو یک متغیر از نوع رشته که برای این کار از تابع join استفاده می کنیم :


string field = string.Join(',',fields);
string value = string.Join(',',values);
("insert into tbname (field) values (value)");

که این متغیر از نوع رشته مناسب برای پاس دادن به پروسجر هست
و در نهایت اینطوری می شه :


("insert into tbname (field1,field2,field3) values (value1,value2,value3)");

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

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

website.expert
پنج شنبه 21 دی 1391, 23:02 عصر
ممنون دوست عزیز من الان این دستورات رو نوشتم:

string[] fields = { "id" , "name" , "family" };
string[] values = { "7", "mohsen", "rezaii" };

string field = string.Join(",", fields);
string value = string.Join(",", values);

string cmd = string.Format("insert into student ({0}) values ({1})", field, value);

SqlConnection conn = new SqlConnection(@"Data Source=...");
SqlCommand insertCmd = new SqlCommand("InsertToTable",conn);
insertCmd.CommandType = CommandType.StoredProcedure;
insertCmd.Parameters.Add(new SqlParameter("@cmd", cmd));

conn.Open();
insertCmd.ExecuteNonQuery();
conn.Close();


البته مقادیر رو دستی دادم ولی مشکلی ندارم بعد درستش می کنم.
با for each هم که گفتید مشکلی ندارم.
الان آیا دستوراتی که نوشتم درست هست؟!
حالا باید SPیه InsertToTable رو چه جوری بنویسم؟!
باز هم ممنون و متشکر.

Saber_Fatholahi
جمعه 22 دی 1391, 00:00 صبح
با سلام،ممنون از راهنماییتون.
فقط یه چند تا سوال و نکته:
1- NH چیه؟
2- در مورد لایه ها کلاً تو پروژه های جدا باشه بهتره یا که نه؟!
خودم فکر کنم از منطقش پیروی کنم و تو یه پروژه انجام بدم بهتره!یه مقدار توضیح بدید ممنون میشم.
سرچ کردم تو این لینک : www.payawebshomal.com/ProjectDetails.aspx?ProjectID=9 (http://barnamenevis.org/www.payawebshomal.com/ProjectDetails.aspx?ProjectID=9) پروژتون رو پیدا و دانلود کردم،دارم نگاه میکنم 100% برای من که تازه کار هستم مفید خواهد بود.
خواستم تشکر کنم از لطفتون.
اگه سوالی در مورد پروژتون برام پیش اومد میتونم بپرسم دیگه؟!:خجالت:
باز هم ممنون و متشکر.

1- NHibernate یک ORM هست مثل Entity Framework می تونی مطالب آموزشی فارسی از سایت مهندس وحید نصیری (http://www.dotnettips.info/search/label/nhibernate) مطالعه کنی
2- در کل هیچ فرقی نداره اما شخصا ترجیح می دم توی پروژه های جدا باشه
3- خواهش می کنم بیشتر سوالات پاسخ دادم در حد توان در خدمتم داکیومنت کد ها رو هم می تونین از سایت مهندس وحید نصیری (http://www.dotnettips.info/) قسمت پروژه ها (http://www.dotnettips.info/projects/details/2) بگیرین.
موفق وموید باشید

Saber_Fatholahi
جمعه 22 دی 1391, 00:06 صبح
میشه توضیح بدید که مزیت های لایه های بیشتر چیه دوست عزیز؟
آیا این کار باعث افزایش کد نویسی و پیچیده تر شدن نمیشه؟!

بهتره این کتاب یک مطالعه بفر مایین


Wrox ASP NET Design Patterns

Fartaj
جمعه 22 دی 1391, 21:30 عصر
ممنون دوست عزیز من الان این دستورات رو نوشتم:
البته مقادیر رو دستی دادم ولی مشکلی ندارم بعد درستش می کنم.
با for each هم که گفتید مشکلی ندارم.
الان آیا دستوراتی که نوشتم درست هست؟!
حالا باید SPیه InsertToTable رو چه جوری بنویسم؟!
باز هم ممنون و متشکر.

یه نمونه برات آماده کردم ولی دیگه خودت گسترش بده من فعلا ساده ترین حالت رو در نظر گرفتم یعنی اینکه همه فیلدها رو من از نوع رشته در نظر گرفتم ولی ممکنه تو بعضی از جدول ها فیلد عددی هم داشته باشیم که موقع ارسال پارامتر باید تغییراتی در تک کتیشن اطراف مقادیر بدیم و اینکه من از حلقه استفاده نکردم اگر بخواهیم پیشرفته تر بنویسیم خیلی کارا می شه انجام داد :
98277

mahsab
پنج شنبه 13 شهریور 1393, 14:15 عصر
سلام

چطور می شه از پروژه سایت سه لایه اجرا گرفت ؟

دوتا ClassLibrary و یه وب سایت به solotion اضافه کردم و وبسایت رو start page قرار دادم ولی وقتی debug رو می زنم error می ده که پروژه حاوی ClassLibrary اجرا نمی شه
راه حل هایی که تو سایت گفته شده رو انجام دادم ولی بازم جواب نمی ده .

mahsab
جمعه 14 شهریور 1393, 15:58 عصر
درست شد .

باید رو solution راست کلیک می کردم property می گرفتم و startpage رو تعیین می کردم .
ولی من رو پروژه سایت startup page رو تعیین کرده بودم .