PDA

View Full Version : دسترسی به نام فیلدها در معماری 3 لایه



elahe1364
دوشنبه 21 مرداد 1392, 09:50 صبح
با سلام
من یه پروژه ای دارم که قبلا با معماری 3 لایه پیاده شده.
توی لایه dal برای هر جدول یک دیتاست ایجاد شده.
توی لایه bll هم تعدادی کلاس general برای کار روی بانک اطلاعاتی،کنترل خطا و ... نوشته شده.

حالا سوال من اینه:
فرض کنید یه جدولی دارم شامل 3 تا فیلد a,b,c
من یه گرید روی فرمم گذاشتم و داده های جدول توی گرید نمایش داده میشه.
حالا برای مثال من یه سری شرط روی فرمم دارم که مثلا اگه کاربر فیلد a رو پر کرد فیلد b توی گرید readoly بشه.
مسلما این شرط باید توی رویدادهای گرید و در لایه user نوشته بشه.که تا اینجا مشکلی ندارم.برای مثال این دستور


if (dgv.Rows[0].Cells["a"].Value != null)
dgv.Rows[0].Cells["b"].ReadOnly = true;

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

مشکل من اینه که اگه در فرم ها بخوام مستقیم از نام فیلدها استفاده کنم،در صورت تغییر نام فیلد در دیتابیس نیاز به تغییرات زیادی در فرم ها هست؟؟؟؟؟؟؟؟؟

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


amir200h
دوشنبه 21 مرداد 1392, 11:12 صبح
خوب بجای نام ستون بیا شماره ایدکسشو بزار. مثلا اگه a ستون اوله بجای a بزار 0

gwbasic
دوشنبه 21 مرداد 1392, 13:06 عصر
قبل از هرچیز پیشنهاد می کنم تا دلیلی برای چند لایه نویسی و تعریف دقیقی از اون پیدا نکردین لایه جدید ایجاد نکنید اگر شما یک لایه DataAccess دارین و یک لایه Business باید این لایه ها تعریف دقیق و مرز مشخصی داشته باشن
و جدای از این مسئله در صورتی که از روش سنتی DataSet استفاده می کنید پیشنهاد می کنم حتما از TypedDataSet و TypedDataTable استفاده کنید
اما در هر صورت حتی اگر از ORM هم استفاده کنید سوال شما به قوت خودش باقیست
اصولا هر جایی که از string استفاده می کنید و این string ممکن است تغییر کند (مثلا نام ستون یا نام پراپرتی) بهتر است اینها را به عنوان یک فیلد const در یک یا چند کلاس مستقل تعریف کنید و از آنها استفاده کنید. فرض کنید شما یک نام دارید به صورت name بنابراین یک کلاس تعریف می کنید به صورت زیر:



public class Info {
public const string Name = "name";
}


از این به بعد هرجا که نیاز باشد از name استفاده کنیم، بجای آن از Info.Name استفاده می کنیم. حال اگر بنا به هر دلیلی name مثلا به FirstName تغییر کرد کافیه یک جا و آن هم در کلاس بالا این تغییر را اعمال کنیم


public class Info {
public const string Name = "FirstName";
}



دقت کنید که اگر از TypedDataTable استفاده می کنید می توانید این کلاس را در دل TypeDataTable مربوطه قرار بدین البته این اصول کار هست که به روشهای متفاوتی می تونید پیاده سازیش کنید

elahe1364
دوشنبه 21 مرداد 1392, 14:55 عصر
خوب بجای نام ستون بیا شماره ایدکسشو بزار. مثلا اگه a ستون اوله بجای a بزار 0

این روش که از روش منم غیر اصولی تر هست.اگر جای ستون ها عوض بشه چی؟؟؟؟؟؟؟؟؟؟؟؟

elahe1364
سه شنبه 22 مرداد 1392, 10:01 صبح
و جدای از این مسئله در صورتی که از روش سنتی DataSet استفاده می کنید پیشنهاد می کنم حتما از TypedDataSet و TypedDataTable استفاده کنید



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

gwbasic
سه شنبه 22 مرداد 1392, 10:48 صبح
یادتون باشه که Refactor کردن یا بازنویسی کد وقتی لازمه که نیازش حس بشه و این نیاز صرفا یک احساس نیست که "می خوام بهتر کد بنویسم". در صورتیکه کد شما کار می کنه و احتمالا در آینده هم نیازی به تغییر اون ندارین و پروژتون قرار نیست سالها پشتیبانی بشه و ... بهتره که دستش نزنین و موردی هم که در بالا توضیح دادم رو به صورت یک کلاس جداگانه انجام بدین
اما اگر در هر صورت به این مسئله نیاز دارین یک راه ساده تر اینه که از Desginer ویژوال استودیو برای ساخت DataSet استفاده کنید به این شکل هم TypedDataset ساخته خواهد شد هم TableAdapter مربوطه ...
و اگر به صورت دستی بخواین این کارو انجام بدین به How to Manually Create Typed DataTable (http://www.codeproject.com/Articles/30490/How-to-Manually-Create-a-Typed-DataTable) مراجعه کنید

elahe1364
سه شنبه 22 مرداد 1392, 12:41 عصر
یادتون باشه که Refactor کردن یا بازنویسی کد وقتی لازمه که نیازش حس بشه و این نیاز صرفا یک احساس نیست که "می خوام بهتر کد بنویسم". در صورتیکه کد شما کار می کنه و احتمالا در آینده هم نیازی به تغییر اون ندارین و پروژتون قرار نیست سالها پشتیبانی بشه و ... بهتره که دستش نزنین و موردی هم که در بالا توضیح دادم رو به صورت یک کلاس جداگانه انجام بدین
اما اگر در هر صورت به این مسئله نیاز دارین یک راه ساده تر اینه که از Desginer ویژوال استودیو برای ساخت DataSet استفاده کنید به این شکل هم TypedDataset ساخته خواهد شد هم TableAdapter مربوطه ...
و اگر به صورت دستی بخواین این کارو انجام بدین به How to Manually Create Typed DataTable (http://www.codeproject.com/Articles/30490/How-to-Manually-Create-a-Typed-DataTable) مراجعه کنید

ساختار قبلی این پروژه قبلا ایجاد شده بوده.dataset ها هم دقیقا به صورت ویزاردی ایجاد شدند.
حالا به خاطر یک سری هماهنگی ها با یه دیتابیس دیگه نام خیلی از جداول و فیلدها قراره تغییر کنه.به خاطر همین تصمیم گرفتم جوری کد بنویسم که دفعات بعدی این مشکلات پیش نیاد.
ولی دقیقا نمیدونم چجوری میتونم از توی لایه user به نام فیلدهای جدولی که در لایه dal قرار داره دسترسی پیدا کنم.
فکر کنم بهترین روش ایجاد یک کلاس برای هر جدول در لایه bll و تعریف نام فیلدها به صورت const هست که شما اشاره کردید.درسته؟؟؟؟؟؟؟؟

gwbasic
سه شنبه 22 مرداد 1392, 14:15 عصر
بله تعریف کلاس جداگانه کفایت می کنه یا اینکه می تونید از Resource File هم استفاده کنید. در ویژوال استودیو Ctrl+Shift+A رو بزنید در پنجره باز شده Resource File رو انتخاب کنید. در اینحالت شما می تونید لیستی از Key/Value ایجاد کنید. بطور مثال Key شما می شود MyTableMyField و Value نام فیلد