عادةً ما تُخزَّن إعدادات البرنامج بملف xml. وفي المقابل يُوفِّر إطار عمل .NET أنواع مُجهَّزة لإسترجاع قيم تلك الإعدادت. مثلًا الملف app.config:
<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="keyName" value="anything, as a string"/> <add key="keyNames" value="123"/> <add key="keyNames" value="234"/> </appSettings> </configuration>
في حالة كان لديك مُفتاحين يَحمِلان نفس الاسم بقسم appSettings بملف الإعدادات كالمثال السابق، تُسترجَع أخِر قيمة.
في الإصدارات 1.0 و 1.1 من إطار عمل .NET كان النوع ConfigurationSettings هو الطريقة المُتَّبَعة لاسترجاع الإعدادات (settings)، لكنه أصبح مَهجُورًا (deprecated) في الإصدارات الحديثة (2.0 أو أحدث) حيث حَلَّت الأنواع ConfigurationManager و WebConfigurationManager مَحَلّه.
استرجاع الاعدادات باستخدام النوع ConfigurationSettings
لاحظ المثال التالي:
using System; using System.Configuration; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main() { string keyValue = ConfigurationSettings.AppSettings["keyName"]; Debug.Assert("anything, as a string".Equals(keyValue)); string twoKeys = ConfigurationSettings.AppSettings["keyNames"]; Debug.Assert("234".Equals(twoKeys)); Console.ReadKey(); } } }
استرجاع الإعدادات باستخدام النوع ConfigurationManager
يُدعِّم النوع ConfigurationManager الخاصية AppSettings مما يَسمَح لك بالاستمرار باسترجاع قيم الإعدادات الموجودة بقسم appSettings بملف الإعدادات بنفس طريقة الاصدارات القديمة.
using System; using System.Configuration; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main() { string keyValue = ConfigurationManager.AppSettings["keyName"]; Debug.Assert("anything, as a string".Equals(keyValue)); var twoKeys = ConfigurationManager.AppSettings["keyNames"]; Debug.Assert("234".Equals(twoKeys)); Console.ReadKey(); } } }
الإعدادات صارمة النوع باستخدام فيجوال ستوديو
بدلًا من استخدام قسم appSettings بملف الإعدادات، تُمكِنك بيئة التطوير المتكاملة فيجوال ستوديو (Visual Studio IDE) من إدارة كلًا من إعدادات البرنامج والمُستخدِم بسهولة مع المميزات الإضافية التالية:
- إعدادات صارمة النوع (strongly typed)، أي يُمكِنك تقييد قيمة الإعدادات بنوع معين بشرط أن يَكون بالإمكان سَلسَلة هذا النوع (serializable).
-
سُهولة فَصْل كلًا من إعدادات البرنامج والمُستخدِم حيث تُخزَّن الأولى بملف إعدادات وحيد
web.configفي حالة المواقع الالكترونية وتطبيقات الويب، بينما تُخزَّن الثانية بملفuser.configبمجلد بيانات المُستخدِمين، والذي يختلف مساره بحسب إصدار نظام التشغيل المُستخدَم. علاوة على ذلك، غُيّرت تسمية الملفapp.configإلىassembly.exe.configمع استبدال اسم الملف التَّنْفيذي بكلمةassembly. - إمكانية دَمج إعدادات البرنامج من عدة مكتبات أصناف (class libraries) إلى ملف إعدادات وحيد بدون حُدوث تَعارُض بالأسماء (name collisions) عن طريق تخصيص قسم (section) لكل مكتبة أصناف.
تُوفِّر غالبية أنواع المشروعات نافذة الإعدادات (settings) بأداة تصميم خاصيات المشروع (Project Properties Designer). تُعدّ هذه النافذة نقطة البداية لإنشاء إعدادات مُخصَّصة لكُلًا من البرنامج والمُستخدِم. تكون هذه النافذة فارغة بشكل مبدئي مع رابط وحيد لإنشاء ملف إعدادات افتراضي.
سيؤدي النقر على هذا الرابط إلى التَغْييرات التالية:
-
ظهور شبكة تَحكُم (grid control) بنافذة الإعدادات، والتي ستُمكِنك من إضافة مُدخَلات (entries) الإعداد وتعديلها وحَذفِها.
-
إنشاء ملف إعدادات (
app.configأوweb.config) في حالة عدم وجوده. -
إضافة عنصر
Settings.settingsأسفل المجلد الخاص بالخاصياتPropertiesبنافذة مُستكشِف الحل (Solution Explorer). سيفَتَح النقر عليه نافذة الإعدادات. -
إضافة ملف جديد
Settings.Designer.__(.cs,.vb,etc.)أسفل مجلد الخاصياتPropertiesبمجلد المشروع. يحتوي هذا الملف على تَعرِيف الصنفSettings. لاحظ أن الشيفرة بهذا الملف مُولَّدة آليًا وبالتالي لا ينبغي تعديلها. مع ذلك لمّا كان هذا الصنف مُعرَّف باستخدَام المُحدِّد الجزئي (partial modifier)، تستطيع تَمديده (extend) وإضافة أعضاء (members) أُخرى له بملف مُنفصل. يُنفِّذ هذا الصنف نمط المتفرّدة (singleton) وتُستخدَم الخاصيةDefaultالمُعرَّفة بداخله للولوج للنُسخة المتفرّدة.
مع كل مُدخَل إِعداد جديد تُضيفُه إلى نافذة الإعدادات، سيَقُوم فيجوال ستوديو بالتالي:
-
تَخزِين المُدخَل الجديد بقسم (section) إعدادات مُخصَّص بملف الإعدادات. صُمم هذا القسم لكي تتم إدارته بواسطة الصنف
Settings. -
إضافة عضو (member) جديد للصنف
Settingsمن النوع المُختار بنافذة الإعدادات. يُعدّ هذا العضو مُمثِلًا للمُدخَل بلغة الـc#، ويُستخدَم لقراءة قيمة الإعداد وتعديلها.
قراءة الإعدادات صارمة النوع المخزَّنة بملف الاعدادات
بدءً بصنف Settings جديد وقسم إعدادات مُخصَّص:

أَضِف مُدخَل إعداد جديد للبرنامج من النوع System.Timespan باسم ExampleTimeout، وأسْنِد إليه قيمة تُساوِي دقيقة واحدة، كالتالي:

ثم اِحفَظ خاصيات المشروع، والذي يُخزِن بدوره مُدخَلات نافذة الإعدادات، كما يُعيد التوليد الآلي للصنف Settings، ويُحَدِّث ملف إعدادات المشروع.
الآن تَستطيع اِسترجاع قيمة هذا المُدخَل بشيفرة C# من خلال الخاصية Default بالنوع Settings، كالتالي:
using System; using System.Diagnostics; using ConsoleApplication1.Properties; namespace ConsoleApplication1 { class Program { static void Main() { TimeSpan exampleTimeout = Settings.Default.ExampleTimeout; Debug.Assert(TimeSpan.FromMinutes(1).Equals(exampleTimeout)); Console.ReadKey(); } } }
يُمكِنك أيضًا الإطلاع على ملف إعدادات المشروع app.config -المُحدَّث تلقائيًا بواسطة فيجوال ستوديو- لفَحْص كيفية تخزين مُدخَلات إعدادات البرنامج، لتجد التالي:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <section name="ConsoleApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <appSettings /> <applicationSettings> <ConsoleApplication1.Properties.Settings> <setting name="ExampleTimeout" serializeAs="String"> <value>00:01:00</value> </setting> </ConsoleApplication1.Properties.Settings> </applicationSettings> </configuration>
اِستخدَم فيجوال ستوديو القسم applicationSettings وليس appSettings لإدارة مُدخَلات نافذة الإعدادات. يحتوي القسم الجديد على قسم فرعي مخصَّص وِفقًا لفضاء الاسم (namespace). يَحوِي هذا القسم الفرعي على عنصر setting مُنفَصِل لكل مُدخَل (entry). لا يُخزَّن نوع المُدخَل بملف الإعدادات وإنما يُفْرَض فقط من خلال الصنف Settings.
يُمكِنك أيضًا الإطلاع على ملف الصنف Settings -المُحدَّث تلقائيًا بواسطة فيجوال ستوديو- لفَحْص كيفية اِستخدَام الصنف ConfigurationManager لقراءة القسم الفرعي المُخصَّص بالأعلى، لتجد التالي:
... [global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("00:01:00")] public global::System.TimeSpan ExampleTimeout { get { return ((global::System.TimeSpan)(this["ExampleTimeout"])); } } ...
لاحظ اِستخدَام السمة DefaultSettingValueAttribute لتخزِين القيمة المُحدَّدة للمُدخَل بنافذة الإعدادات بأداة تصميم خاصيات المشروع. تُستخدَم هذه القيمة الافتراضية في حالة لم يكن هناك عنصر مقابل لهذا المُدخَل بملف الإعدادات.
ترجمة -وبتصرف- للفصل Settings من كتاب .NET Framework Notes for Professionals

أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.