PDA

View Full Version : سوال: لود کلاس به صورت داینامیک



foadabd
جمعه 29 بهمن 1389, 12:00 عصر
صورت مسئله:
می خوام تو یک فولدر چند تا کلاس با کارهای مختلف مثلا چندین مدل فشرده سازی رو تو صفحه لود کنم ولی با این تفاوت که ادمبن بتونه از m تا کلاس n تا رو به دلخواه فعال کنه یه جدول تو دبتابیس داربم که شامل اسامی و آرس و غیره این کلاس هاست.

چی کار کنم کسی میتونه راهنمایی کنه؟؟

راستی به سولوشن بد(اصولی نیست) که همه کلاس ها رو تو به IF بگذترم و ار db فعال بودنشو چک کنم و بعد اگه TRUE بود کلاس لود بشه : مشکل: به جای N بار خوندن از M ،dB بار باید خوند(بار اضافی).

ممنون مشم راهنمایی کنید.

Mostafa_Dindar
جمعه 29 بهمن 1389, 17:31 عصر
سلام ،

من دقیقا متوجه ضرورت اینکار نمیشم !

می خوام تو یک فولدر چند تا کلاس با کارهای مختلف مثلا چندین مدل فشرده سازی رو تو صفحه لود کنم ولی با این تفاوت که ادمبن بتونه از m تا کلاس n تا رو به دلخواه فعال کنه یه جدول تو دبتابیس داربم که شامل اسامی و آرس و غیره این کلاس هاست.


چرا همچین کاری ؟ هرگاه شما کلاسهایتان را در فلدر App_Code قرار دهید , از تمامی نقاط پروژه( تمای صفحات ) به اون دسترسی دارید ...

اگر هدف شما محدود کردن سطح دسترسی به آن متدهاست ، کسی نمیتواند از اون متدها استفاده کنید الا شما ! و شما هم صفحاتی که از آن متدها استفاده میکند را تنها برای مدیر قابل دسترس میکند , یا اینکه در صفحات Public اجازه کار با آن متدها را به شخص با Role مدیر میدهید .

موفق باشید

foadabd
شنبه 30 بهمن 1389, 08:50 صبح
نه مهندس!!
گفتم فکر کنید مثلا چندین مدل فشرده سازی داریم که همه با هم کار نمی کند و می خواهیم حق انتخاب را به مدیر سایت بدهیم که کدام یا کدامین را انتخاب کند!!! اگه متوجه نشدید فرضا جوملا را فرض کنید که تو مدیریت پلاگین هاش مدیر می تونه یک یا چند سرویس را فعال با غبر فعال کنه(البته می دونم با user control می شه این کارو کرد ولی نمی خوام این قسمت رو usercontrol استفاده کنم چون فقط چند تا متده و شمای بیرونی (user interface) نداره پس لزومی نداره از این کارو بکنم تو پشت صفحه فقط کلاس ها را صدا بزنه کافیه(البته به دلخواه))
بعد من کلا یک صفحه دارم که اجرا بسته به query stringو permission اجزا توش لود میشه!!

Javad_Darvish_Amiry
شنبه 30 بهمن 1389, 15:59 عصر
سلام خسته نباشید. اگه من درست متوجه شده باشم، منظورتون اینه که اسم کلاس به صورت یه رشته ذخیره بشه تو پایگاه، و شما از روی اسم کلاس لودش کنید (مثل کاری که با پرووایدر ها انجام میشه). برای این کار همه کلاس ها باید یا یک اینترفیس رو پیاده سازی کنند یا از یه کلاس مشخص ارث ببرن که شما بتونید تو ران-تایم از اون اینترفیس یا کلاس پایه نمونه سازی کنید و لی توی نمونه شیئ کلاس مورد نظرتون رو بریزید. به عنوان مثال ما کلاس های فشرده سازی با نام های A, B, C داریم که همشون اینترفیس I رو پیاده سازی کردن. I یه متود به اسم Compress داره که کار فشرده سازی باید تو این متود انجام بشه. به شکل زیر:


public interface I {
void Compress(HttpContext context);
}

public class A : I {
public void Compress(HttpContext context) {
// take your A compress logic here...
context.Response.Write("take your A compress logic here...");
}
}

public class B : I {
public void Compress(HttpContext context) {
// take your B compress logic here...
context.Response.Write("take your B compress logic here...");
}
}

public class C : I {
public void Compress(HttpContext context) {
// take your C compress logic here...
context.Response.Write("take your C compress logic here...");
}
}
جایی هم که میخواید از هر کدوم از کلاس های مورد نظر استفاده کنید، با استفاده از متود CreateInstance از کلاس Activator میتونید اشیاء مورد نظرتون رو از روی اسمشون بسازید. مثلا میخوایم تو صفحه Default و تو رویداد پیج لود از یکی از کلاس های A, B و یا C بسته به مورد نمونه سازی کنیم و متود Compress رو ازش فراخونی کنیم. میشه مثل کد زیر:


protected void Page_Load(object sender, EventArgs e) {
I compressor = Activator.CreateInstance(Type.GetType("A")) as I;
compressor.Compress(HttpContext.Current);
}

به جای کلمه قرمز شده در بالا (A) میتونید اسم هر کدوم از کلاس هایی که اینترفیس I رو پیاده سازی کردند، ذکر کنید و نمونه ای هم که به دست میارید کلاس مورد نظر هست. تو مثال ساده ای که بالا زدم، اگه اجراش کنید، به راحتی میبینید که با تغییر A به B یا C متودی هم که فراخونی میشه تغییر میکنه و از کلاس مورد نظر شما استفاده میشه. موفق باشید.

foadabd
شنبه 30 بهمن 1389, 17:09 عصر
خیلی ممنون و تشکر از وقتی که گذاشتید
در مورد مفهوم کاملا درست فهمیدید و تشکر. ولی این کاری که شما توسط این کد انجام میدید برای صدا کردن یک کلاس خوبه (وقتی بخای مثلا اسامی A ,B ,C را از DB بخونیم ) ولی چند تا رو نمیشه مگر شیء را دوباره بنویسی و این کار تعدادش معلوم نیست می تواند یک کلاس باشه ویا تمامی کلاس ها که 20 تا شود!! چون تعدادش معلوم نیست نمیشه رویه صدا کردن های اشیا به این صورت حساب باز کرد(شاید هم من نمی تونم)

اینه که اسم کلاس به صورت یه رشته ذخیره بشه تو پایگاه، و شما از روی اسم کلاس لودش کنیداگه مثل usercontrol ها میشد مثل این ها:

Control component;
string adress= "";// check in DB and addd component name
component = LoadControl(adress);
PHContent.Controls.Add(component);میشد به صورت مستقل توی یک foreach ای از دیتابیس صدا زد !! عالی بود؟؟

باز هم ممنون ار وقتی که گذاشتید

Javad_Darvish_Amiry
شنبه 30 بهمن 1389, 21:12 عصر
به هر حال شما برای نمونه سازی از دیتاتایپ ها ناگزیر از نمونه سازی تک تک اونها هستید. آنچنان که نمیتونید یه int و یه string رو تو یه مرحله نمونه سازی کنید. با توضیحی که بالا دادید، من گیج شدم و نمیدونم مشکل کار کجاست. موفق باشید.