PDA

View Full Version : سوال: داشتن فایل config بهتره یا ...



chaalesh
سه شنبه 10 فروردین 1389, 03:27 صبح
با سلام
من دوتا سوال اساسی دارم
1- برای ذخیره مقادیری که در کل سایت به دفعات مورد استفاده قرار می گیرد و به ازای هر نسخه از سایت تغییر می کند بهتر است از چه چیزی استفاده شود؟ - اطلاعاتی مثل ایمیل مدیر سایت ، تعداد فلان آیتم در فلان جای برنامه و....

من خودم الان یک کلاس به عنوان mysite برای نگهداری و ذخیره و لود از روی دیتابیس استفاده می کنم. - لود در application start
روشه خوبی هست ؟؟

اگه که روش خوبی نیست روش بهتر کدومه ؟
توی YAF دیدم که یک فایل config داشت توی اون تنظیماتی را set می کرد
این روش به درد من می خوره ؟ - سوالی پرسیدم تا اگر نظری دارید بفرمایید

2- برای داشتن یک فایل config در روی برنامه برای نگهداری بعضی از اطلاعات، روش پیاده سازی چگونه است ؟
من یکی دو جا دیدم به web.config میان با استفاده از configSectionsیک بخش جدید اضافه می کنند و براش یک کلاس هم تعریف می کنند و در web.config بخشی با نام معرفی شده در configSections اضافه کرده و توی اون بخش متغییر های خودشون رو معرفی و مقدار دهی می کنند
من می خوام فایلم جدا از web.config باشه

moharrami
سه شنبه 10 فروردین 1389, 09:20 صبح
می تونی یه فایل xml داشته باشی و اطلاعاتت رو تو اون ذخیره کنی و فایل رو جایی ذخیره کنی که بقیه حق دسترسی به اون رو نداشته باشن. برا خواندن فایل و نوشتن در اون هم پیشنهاد میکنم از Linq2Xml استفاده کنی

chaalesh
سه شنبه 10 فروردین 1389, 13:32 عصر
نه من می خوام خیلی راحت - عین خواندن از web.config - اطلاعات خوانده بشن
این اطلاعات به ازای یک صفحه نمایش برای یک بازدید کننده شاید 4 یا 5 دفعه مورد استفاده قرار بگیرند
بنظر شما اگر از xml برای اینکار استفاده کنم سربار اضافی نمیاره ؟

m.hamidreza
سه شنبه 10 فروردین 1389, 19:54 عصر
سوال2:
شما میتونید با استفاده از تگ appSettings در configuration مقادیر مورد نظرتون رو اضافه کنید باینصورت:


<configuration>
<appSettings>
<add key="websiteName" value="My New Website"/>
<add key="welcomeMessage" value="Welcome to my new Website, friend!"/>
</appSettings>
و به اینصورت مقادیر رو بخونید:


using System.Configuration;
protected void Page_Load(object sender, EventArgs e)
{
lblSiteName.Text =
ConfigurationManager.AppSettings["websiteName"];
lblWelcome.Text =
ConfigurationManager.AppSettings["welcomeMessage"];
}
در AppSettings شما فقط نوع داده String میتونید تعریف کنید و این مساله باعث ایجاد محدودیت هایی در ذخیره انواع داده های موردنظر شما میشه. یه روش کاملتر اینه که از configSections استفاده کنید. در این روش شما با تعریف یه ساختار مشخص از اطلاعاتی که لازم دارید میتونید کارهای خارق العاده ای رو انجام بدید.:لبخندساده:
بعنوان مثال متناسب با نیازتون یه تگ به اسم orderService با ویژگی های ذیل تعریف می کنید:


<orderService available="true" pollTimeout="00:01:00"
location="tcp://OrderComputer:8010/OrderService"/>
زیبایی روش به اینجاش هست که شما با یه کلاس سر و کار خواهید داشت طبق مشخصه های اون تگ:


public class OrderService : ConfigurationSection
{
[ConfigurationProperty("available",
IsRequired = false, DefaultValue = true)]
public bool Available
{
get { return (bool)base["available"]; }
set { base["available"] = value; }
}
[ConfigurationProperty("pollTimeout",
IsRequired = true)]
public TimeSpan PollTimeout
{
get { return (TimeSpan)base["pollTimeout"]; }
set { base["pollTimeout"] = value; }
}
[ConfigurationProperty("location",
IsRequired = true)]
public string Location
{
get { return (string)base["location"]; }
set { base["location"] = value; }
}
}
حالا باید این کلاس رو در configSection ثبت کنید:


<configuration>
<configSections>
...
<section name="orderService" type="OrderService" />
</configSections>
<orderService available="true" pollTimeout="00:01:00"
location="tcp://OrderComputer:8010/OrderService"/>
<system.web>...</system.web>
</configuration>
دسترسی در این حالت به این صورت خواهد بود:


Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
OrderService custSection =
(OrderService)config.GetSection("orderService");
lblInfo.Text += "Retrieved service information...<br />" +
"<b>Location:</b> " + custSection.Location +
"<br /><b>Available:</b> " + custSection.Available.ToString() +
"<br /><b>Timeout:</b> " + custSection.PollTimeout.ToString() + "<br /><br />";
ممکنه شما بخوای زیرمجموعه اون تگ یه آیتم دیگه هم اضافه کنی مثلا به این صورت:


<orderService available="true" pollTimeout="00:01:00">
<location computer="OrderComputer" port="8010" endpoint="OrderService" />
</orderService>
کلاسش اینجوری میشه:


public class Location : ConfigurationElement
{
[ConfigurationProperty("computer",
IsRequired = true)]
public string Computer
{
get { return (string)base["computer"]; }
set { base["computer"] = value; }
}
[ConfigurationProperty("port",
IsRequired = true)]
public int Port
{
get { return (int)base["port"]; }
set { base["port"] = value; }
}
[ConfigurationProperty("endpoint",
IsRequired = true)]
public string Endpoint
{
get { return (string)base["endpoint"]; }
set { base["endpoint"] = value; }
}
}
و باید در کلاس OrderService هم ارتباط دو کلاس رو برقرار کنی:


[ConfigurationProperty("location",
IsRequired = true)]
public Location Location
{
get { return (Location)base["location"]; }
set { base["location"] = value; }
}
حالا:


lblInfo.Text = "<b>Server:</b> " + custSection.Location.Computer

موفق باشید.
پ.ن: جهت کسب اطلاعات بیشتر میتونید به کتاب Apress Pro ASP.NET 3.5 مراجعه کنید.

chaalesh
چهارشنبه 11 فروردین 1389, 00:30 صبح
تشکر از جوابتون
و تشکر از وقتی که برای این سوال گذاشتید
من در سوال 2 منظورم هیمن روش شما بود ولی چون اجراش نکرده ام نتونستم بطور واضح توضیح بدم
سوالم اینه که این روش اطلاعات را در همان web.config ذخیره می کند حالا من اگه بخوام این کار رو در یک فایلی بجز web.config انجام بدم چی ؟
راستش من تا حالا برای هر کاری چندین بار کد نوشتم - البته بجز اولین بار برای هر کار، دفعات بعدی بیشتر کپی و دستکاری های جزئی توی کد قبلی بود
می خوام بعد از این هر بخشی که تولید میکنم کامل باشه و برای هر بخش بتونم با یک فایل تنظیماتی امکانات و تغییرات را اعمال کنم
نمی خوام اینا توی web.config باشه چون شاید چندین فایل بشه.

m.hamidreza
چهارشنبه 11 فروردین 1389, 11:46 صبح
خواهش میکنم.
این روش منوط به استفاده از وب کانفیگ هست.
اون ویژگی Elementها که میتونید زیرمجموعه بسازید نمیتونه به شما کمک کنه؟ فکر نمیکنم جور دیگه بشه اینقدر راحت یه ساختار پیوسته از اطلاعات درست کرد و خیلی راحت هم بهش دسترسی داشت.
حتی شما تو DataBinding هم میتونید از این روش استفاده کنید مثلا:


Text="<%$AppSettings:appName%>"

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

naeeme
شنبه 21 فروردین 1389, 08:46 صبح
m.hamidreza
من کدهای شما رو که نگاه می کردم، دیدم برای تغییر مقدار موجود در web.config کدی وجود نداره. یعنی اگر من بخوام در زمان نصب برنامه یا در هر زمان دیگه ای از داخل سیستم این کقادیر پیشفرض رو تغییر بدم، باید در web.config تغییرتی اعمال کنم. با توجه به اینکه برنامه دسترسی نوشتن به web.config رو نداره، باید چه جوری عمل کنم؟؟

Mostafa_Dindar
شنبه 21 فروردین 1389, 10:22 صبح
m.hamidreza
من کدهای شما رو که نگاه می کردم، دیدم برای تغییر مقدار موجود در web.config کدی وجود نداره. یعنی اگر من بخوام در زمان نصب برنامه یا در هر زمان دیگه ای از داخل سیستم این کقادیر پیشفرض رو تغییر بدم، باید در web.config تغییرتی اعمال کنم. با توجه به اینکه برنامه دسترسی نوشتن به web.config رو نداره، باید چه جوری عمل کنم؟؟


روش اول حتما و روش دوم احتمالا در مواردي استفاده ميشه كه تغيرات به ندرت انجام ميگيره و سايت به سايت هست ، به عبارتي تنها مقادير ثابت در اون قرار ميگيرند


1- برای ذخیره مقادیری که در کل سایت به دفعات مورد استفاده قرار می گیرد و به ازای هر نسخه از سایت تغییر می کند بهتر است از چه چیزی استفاده شود؟ - اطلاعاتی مثل ایمیل مدیر سایت ، تعداد فلان آیتم در فلان جای برنامه و....

naeeme
شنبه 21 فروردین 1389, 10:50 صبح
روش اول حتما و روش دوم احتمالا در مواردي استفاده ميشه كه تغيرات به ندرت انجام ميگيره و سايت به سايت هست ، به عبارتي تنها مقادير ثابت در اون قرار ميگيرند
خوب! من در نظر داشتم یه فایل config دیگه در برنامه داشته باشم که به اون دسترسی نوشتن رو بدم و بتونم این تغییرات رو درش اعمال کن اما هرچه با کمک دستور WebConfigurationManager.OpenWebConfiguration سعی می کنم که اون فایل رو باز کنم، فایل رو نمی شناسه. اسم فایل رو web.config گذاشتم و در یک زیرشاخه از شاخه اصلی اما نتونستم بازش کنم.
فکر می کنید مشکل از کجاست؟؟ و آیا میشه این کار رو انجام داد؟

Mostafa_Dindar
شنبه 21 فروردین 1389, 10:54 صبح
خوب! من در نظر داشتم یه فایل config دیگه در برنامه داشته باشم که به اون دسترسی نوشتن رو بدم و بتونم این تغییرات رو درش اعمال کن اما هرچه با کمک دستور WebConfigurationManager.OpenWebConfiguration سعی می کنم که اون فایل رو باز کنم، فایل رو نمی شناسه. اسم فایل رو web.config گذاشتم و در یک زیرشاخه از شاخه اصلی اما نتونستم بازش کنم.
فکر می کنید مشکل از کجاست؟؟ و آیا میشه این کار رو انجام داد؟

خير ، تنها به صورت دستي ميتونيد در وب كانفيك بنويسيد .

موفق باشيد

naeeme
شنبه 21 فروردین 1389, 15:08 عصر
خير ، تنها به صورت دستي ميتونيد در وب كانفيك بنويسيد .

موفق باشيد
دوست عزیز من این کار رو انجام دادم.
همونطور که گفتم، در یک زیرشاخه از شاخه های وبم، یک فایل به نام web.config قرار دادم که در اون فقط اطلاعات مربوط به تنظیماتم رو گذاشتم و به اون فایل دسترسی خواندن و نوشتن دادم. بعد با استفاده از کدهای زیر، اطلاعات اون رو تغییر دادم




Dim config As System.Configuration.Configuration =
WebConfigurationManager.OpenWebConfiguration(confi gPathFile)

'Modify Existeing Key in Web.config
config.AppSettings.Settings.Item(key).Value = value
config.Save(ConfigurationSaveMode.Modified)