PDA

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



mahdi_farhani
جمعه 01 آذر 1387, 08:09 صبح
در برنامه که دارم مینویسم ، یک کلاس BasePage دارم که از UI .Page مشتق میشه و کلیه صفحات که دارم از کلاس BasePage ارث بری میکنن .این کلاس داری چندین Property هست ، که این خاصیت ها در جاهای مختلف استفاده و مقدار دهی میشوند .
بعضی از این خاصیت را باید بتوان بدون اینکه شی از کلاس BasePage تعریف بشه دسترسی داشته باشم ( یعنی همون خاصیت Static ) و بتوان در دیگر کلاس ها با همین خاصیت استفاده بشه .
مثل PortalID ، یک بار در اول اجرای برنامه مقدار دهی میشود و بعد از آن باید در سراسر برنامه از این خاصیت استفاده بشه .
حالا مشکل ، نحوه تعریف و نگه داری این خاصیت است .
اگر کلاً Static تعریف کنم ( که این کار از نظر اساتید مشکل داره) دسترسی عمومی پیدا میکنه ، بین تمام کاربران ، که نمی خواهم اینطور باشه.
اگر از Application استفاده کنم ، یک سری کد در Global.asax دارم که در قسمت BeginRequest نوشته شده و احتیاج دارن به این خاصیت ها دسترسی داشته باشن و متاسفانه در این زمان استفاده از Application خطا رخ میده.
استفاده از ViewState هم خطا نمیده نمیده ولی مشکلات دیگری برای خودش داره
در ضمن زمانی که از Application و Viewstate استفاده میشه نباید Property از نوع Static تعریف شده باشه ، ولی من احتیاج دارم بدون تعریف شئ به این خاصیت ها دسترسی داشته باشم .
از Session هم به چند دلیل نمیشه استفاده کرد.
cache میمونه که نمیدونم جواب میده یا نه ، در ضمن 11 خاصیت دارم که این حالت رو دارند .

hassanf
جمعه 01 آذر 1387, 12:00 عصر
یه Property استاتیک از نوع Session تعریف کن.



public static int Id
{
get
{
if (HttpContext.Current.Session["Id"] == null)
return -1;
return Convert.ToInt32(HttpContext.Current.Session["Id"]);

}
set
{
HttpContext.Current.Session["Id"] = value;
}
}


در ضمن BaseClass شما باید public باشه تا Error نده.

mahdi_farhani
جمعه 01 آذر 1387, 13:59 عصر
از Session هم به چند دلیل نمیشه استفاده کرد.

دوست عزیز خوب بود به این هم یه نگاه میکردی

mahdi_negahi
جمعه 01 آذر 1387, 14:31 عصر
1- همه آن 12 تا Property در یک کلاس می گذاریم و با Pattern Singleton تضمین میکنیم که در سطح Application فقط یک آبجکت از آن وجود داشته باشد


// This is Setting Object with Singleton Pattern
class ProgrammSetting
{
private static ProgrammSetting setting;



private static string _CacheKey="ProgrammSetting";
// Note: Constructor is 'protected'
protected ProgrammSetting()
{
}
// Your Property.....................................
private int _Property1;
public int Property1
{
get { return _Property1; }
set { _Property1 = value; }
}
private int _Property2;

public int Property2
{
get { return _Property2; }
set { _Property2 = value; }
}
// Your Property.....................................
public static ProgrammSetting Instance()
{
setting = System.Web.HttpContext.Current.Cache[_CacheKey] as ProgrammSetting;
// Use 'Lazy initialization'
if (setting == null)
{
setting = new ProgrammSetting();
System.Web.HttpContext.Current.Cache.Insert(_Cache Key, setting, null,
DateTime.Now.AddSeconds(120),
System.Web.Caching.Cache.NoSlidingExpiration);
}

return setting;
}
}
توجه کن که تمام عضوهای static به صورت خصوصی تعریف شده بجر متد Instance
همیشه برای بدست آوردن و درست کردن یک object از کلاس ProgrammSetting باید از این متد استفاده کنید.

فقط یک خبره باید راهنمایی کنه که آیا اضافه کردن object ProgrammSetting در کش درست است چون کد من فقط 120 ثانیه نگه می دارد

پیروز باشد

hassanf
جمعه 01 آذر 1387, 15:19 عصر
فقط یه سوالی که هست اینکه هیچ تضمینی وجود نداره که Cache حتی قبل از 120 ثانیه از بین نره و اطلاعاتی که ذخیره کردیم هم از بین میره؟