الخيط استخدام آمن للنظام.Configuration
-
09-09-2019 - |
سؤال
هل هناك طريقة سهلة للوصول إلى بيانات التكوين القائم على النظام.
فصول System.configuration، مثل معظم فئات أخرى (كل شيء) في وثائق مكتبة .NET في Microsoft في Microsoft.
أي عدد ثابت (مشترك في Visual Basic) أعضاء هذا النوع هم مؤشر ترابط آمن. أي أعضاء مثيل غير مضمون ليكون آمنا للخيط.
من قراءتي لهذا، ConfigurationSection
الكائنات التي تم إرجاعها من ConfigurationManager.GetSection(string)
وغيرها من الطرق المماثلة (على سبيل المثال OpenExeConfiguration(string exePath).GetSection(string)
) يجب ألا يفترض أن تكون آمنة للخيط وبالتالي لا ينبغي أن تستخدمها سياقات تنفيذ متعددة. هذا يحظر تخزين أ ConfigurationSection
في Singleton من شأنها أن تكون آمنة للخيط لأنه أثناء الوصول إلى كائن القسم قد يكون آمنا، فإن الأعضاء على الكائن نفسه غير آمنين.
مكالمات متعددة إلى GetSection
, ومع ذلك، من المحتمل أن تتطلب إعادة تحليل ملفات التكوين وتخصيص جديد ConfigurationSection
من غير المرجح أن يتغير الحالات التي لديها مرفقات عالية تفكر في التكوين بعد التهيئة. علاوة على ذلك، يبدو نسخ بيانات التكوين في كائن آخر تم إجراؤه مؤلفة الخيط آمنة لهزيمة إحدى الفوائد الرئيسية لاستخدام حزمة التكوين المضمنة في المقام الأول (من السهل الوصول إلى معلومات التكوين المحولة والحصن دون الكثير من المراجع الشفرة).
لذلك، هل هناك طريقة للاستخدام System.Configuration
بطريقة آمنة للخيط دون اللجوء إلى التحليل الزائد وتخصيص أقسام التكوين؟ هل ينفذ بنفسك ConfigurationSection
مجانا أنت من عدم وجود ضمان مقدمة من قبل Microsoft على الرغم من أنك تصل إلى ذلك من خلال System.Configuration
واجهات (وإذا كان الأمر كذلك، كيف يمكنك تنفيذها لتكون آمنة للخيط عند الوصول إلى القاعدة ConfigurationSection
مطلوب مفهرس للوصول إلى البيانات المكونة)؟
المحلول
المثيل الذي تم إرجاعه من Gensection ليس آمنا للخيط. هذا يعني أنك بحاجة إلى إضافة رمز القفل من أجل استخدامه في Singleton الخاص بك.
لا تقوم عدة مكالمات بعدم تحليل الملف، ما لم يتغير الملف. يتم تخزين البيانات مؤقتا في الذاكرة.
يتم حل مشكلة سلامة الخيط الخاصة بك بسهولة باستخدام قفل (لست متأكدا من أنك ستحتاج إلى ذلك، إلا إذا كنت تقوم بتغيير التكوين في وقت التشغيل)، ولا توجد مشكلة في الأداء.
نصائح أخرى
ConfignIgrormanager.getSection (سلسلة) عضو ثابت عام، وبينما تنص MSDN "أي ثابتة قانونية (مشتركة في Visual Basic) من هذا النوع من الخيط آمن"، يمكنك أن تفترض أنها آمنة للاستخدام.
أما بالنسبة للأداء، سأكون على استعداد لافتراض أن MS جعلتها فعالة للغاية بالفعل واستخدام وظائفها كما هي. تذكر: الأمثل المبكر هو جذر الشر.