بدائل لاستخدام web.config لتخزين الإعدادات (للحلول المعقدة)

StackOverflow https://stackoverflow.com/questions/306169

سؤال

في تطبيقات الويب الخاصة بنا، نقوم بفصل طبقات الوصول إلى البيانات الخاصة بنا إلى مشاريع خاصة بها.

وهذا يخلق بعض المشاكل المتعلقة بالإعدادات.

نظرًا لأن DAL قد يحتاج في النهاية إلى استهلاكه من أكثر من تطبيق واحد، فإن web.config لا يبدو مكانًا جيدًا للاحتفاظ بسلاسل الاتصال وبعض الإعدادات الأخرى المتعلقة بـ DAL.

لحل هذه المشكلة، قدمنا ​​في بعض مشاريعنا الأخيرة مشروعًا ثالثًا للإعدادات فقط.نضع الإعداد في نظام ملفات .Setting...باستخدام برنامج تضمين بسيط، كان من السهل تحقيق القدرة على الحصول على إعدادات مختلفة لبيئات مختلفة (Dev، QA، Staging، Production، إلخ).

المشكلة الوحيدة هي أن مشروع الإعدادات (بما في ذلك فئة .Settings) يتم تجميعه في تجميع، لذلك لا يمكنك تغييره دون إجراء إنشاء/نشر، ويريد بعض عملائنا أن يكونوا قادرين على تكوين مشاريعهم بدون Visual استوديو.

إذن، هل هناك ممارسة أفضل لهذا؟لدي هذا الشعور بأنني أعيد اختراع العجلة.

خطرت لنا بعض الحلول، مثل تخزين الإعدادات في دليل ثابت على الخادم بتنسيق XML الخاص بنا.ولكن مرة أخرى، أفضل تجنب الاضطرار إلى إعادة إنشاء التشفير للقيم الحساسة وما إلى ذلك.وأفضّل أن أبقي الحل قائمًا بذاته إن أمكن.

يحرر: لم يحتوي السؤال الأصلي على السبب الحقيقي المتمثل في عدم قدرتنا (على ما أعتقد) على استخدام web.config ...وهذا يضع بعض الإجابات (الجيدة جدًا) خارج السياق، يا سيئة.

هل كانت مفيدة؟

المحلول

تقسيمها.استخدم حل ملف تخزين XML الثابت للاتصال بقاعدة البيانات، المشفر باستخدام وظائف التشفير المضمنة في .NET (لا تقم بإنشاء وظائف خاصة بك).بعد ذلك، باستخدام اتصال قاعدة البيانات الناتج، ابحث عن "جدول الإعدادات" في قاعدة البيانات.بهذه الطريقة يمكنك تعديل إعداداتك دون إعادة النشر.إذا كان عملاؤك يريدون أن يكونوا قادرين على تغيير سلسلة اتصال قاعدة البيانات بدون الاستوديو المرئي، فما عليك سوى كتابة تطبيق Windows Forms صغير قادر على إنشاء سلسلة الاتصال المشفرة وحفظ ملف تخزين XML الثابت، وإذا لزم الأمر، يمكنه أيضًا الاتصال إلى قاعدة البيانات (عبر نفس الملف) وتعديل جدول الإعدادات حسب حاجة المستخدم.

نصائح أخرى

System.Configuration.ConfigurationManager.connectionsTrings و System.Configuration.ConfigurationManager.Appsettings تحتوي على إعدادات من التطبيق التنفيذي ، لذا في DAL ، يمكنك تخزين الإعدادات في ملف الويب الخاص بك.

بالنسبة لنظامك، يمكنك إنشاء قسم تكوين مخصص والذي سيتم وضعه في ملف web.config الخاص بك أو ملف Consumer*.config الخاص بـ DAL الخاص بك. في ملفات التكوين هذه، يمكنك تحديد تحميلها من ملف تكوين منفصل لتصميمك وموقعك.الرجوع إلى ملفات التكوين الخارجية من Web.Config كيف:إنشاء أقسام تكوين مخصصة باستخدام ConfigurationSection

وبدلاً من ذلك، يمكنك تحميل بيانات تكوين DAL يدويًا من أي ملف باستخدام ConfigurationManager.OpenExeConfiguration

يمكنك إضافة ما يعادل ملف web.config المسمى app.config والذي يتم تجميعه في ملف مسمى لمشروع dll أو exe للتعليمات البرمجية الخاصة بك.هذا قابل للتغيير تمامًا دون الحاجة إلى إعادة الترجمة.يمكنك استخدام الإعدادات القياسية لسلاسل الاتصال وإعدادات التطبيقات المتنوعة التي يمكن تعريفها في زوج المفتاح/القيمة - أو مع المزيد من العمل، يمكنك تحديد فئة وقسم إعدادات التكوين المخصصة الخاصة بك.يمكنك أيضًا الرجوع إلى الإعدادات في تكوين تطبيقك - بحيث يمكنك الحصول على 3 إعدادات مخزنة في تطبيقك (DEV، وQA، وPROD) ثم الرجوع فقط إلى الإعداد الذي تريده في وقت التشغيل في ملف app.config الخاص بك.فيما يلي مثال لأحد الإعدادات التي تم إنشاؤها لإعداد خدمة الويب.

<?xml version="1.0" encoding="utf-8"?>
<التكوين>
<أقسام التكوين>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup، النظام، الإصدار=2.0.0.0، الثقافة=محايدة، PublicKeyToken=b77a5c561934e089">
<section name="{Project}.Properties.Settings" type="System.Configuration.ClientSettingsSection، النظام، الإصدار=2.0.0.0، الثقافة=محايدة، PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, الإصدار=3.0.0.0, الثقافة=محايدة, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<إعدادات التطبيق>
<{مشروع}.Properties.Settings>
<setting name = "{SettingName}" serializeAs = "String">
<value>{SettingValue</value>
</الإعداد>
</{Project}.Properties.Settings>
</applicationSettings>
<microsoft.web.services3>
<الأمن>
<securityTokenManager>
<add type="Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager، Microsoft.Web.Services3، الإصدار=3.0.0.0، Culture=محايد، PublicKeyToken=31bf3856ad364e35" مساحة الاسم ="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot;localName = "UsernameToken" />
</securityTokenManager>
</الأمن>
</microsoft.web.services3>
</التكوين>

يبدو أنك لا تفهم كيفية عمل web.config/app.config، إذا كنت أقرأك بشكل صحيح.لنفترض أن لديك بنية مثل ما يلي:

مشروع دال

مراجع:

  • بعض المكتبات الأساسية
  • مراجع متنوعة

الطبقات:

  • DatabaseHelper
  • فئة الكائن1
  • فئة الكائن2
  • إلخ...

مشروع الويب

مراجع:

  • بعض المكتبات الأساسية
  • مشروع دال
  • مراجع متنوعة

الصفحات:

  • Default.aspx
  • SomePage1.aspx
  • إلخ...
  • Web.config

في فئة DatabaseHelper، يمكنك الرجوع إلى سلسلة الاتصال كما يلي:

string connString = ConfigurationManager
  .ConnectionStrings["myConnString"]
  .ConnectionString;

عندما يحدث هذا في وقت التشغيل، سيتم تشغيل فئة DatabaseHelper ضمن نطاق التطبيق نفسه مثل صفحة الويب الخاصة بك، وبالتالي، فإن أي استدعاءات إلى ConfigurationManager ستحمل الطلب من ملف web.config الذي يوفره مشروع الويب.

لذلك، تحتاج فقط إلى ملف التكوين واحد في الويب/وحدة التحكم/winforms/إلخ...المشروع، ولا داعي للقلق بشأن وجود واحد في وقت التصميم في كل مشروع من مشاريع مكتبة صفك.

إذا قمت بالفعل بتشغيل DAL الخاص بك كخدمة أو تطبيق وحدة تحكم منفصل أو شيء من هذا القبيل، عندها فقط ستحتاج إلى إعطاء مشروع DAL ملف app.config / web.config الخاص به.

سيكون هناك نهج مختلف تماما للاستخدام سكليتي وقم بتخزين جميع إعدادات التطبيق الخاصة بك هناك.يمكنك حماية قاعدة البيانات المعنية بكلمة مرور، إذا كان ذلك ذا أهمية للتطبيق، ويمكنك إنشاء بعض جداول الخصائص/القيم البسيطة لتخزين البيانات.

باستخدام محول SQLite ADO سيتطلب فقط ملف DLL إضافيًا واحدًا في المشاريع للوصول إلى الإعدادات وستكون قاعدة بيانات SQLite نفسها متاحة للأشخاص الذين لا يريدون استخدام Visual Studio.يوجد أيضًا مكون إضافي لـ Firefox للتفاعل مع قواعد بيانات SQLite.

يمكنك تخزين الإعدادات في أي ملف Xml قديم واستخدام XmlSerializer لأخذ فصلك وتحويله إلى < - > من Xml.في آخر إجابة لقد كتبت بعض التعليمات البرمجية التي فعلت ذلك بالضبط.تقوم الإجابة المرتبطة بإجراء تسلسل لقائمة من الكائنات البسيطة، ولكنها تعمل أيضًا على إجراء تسلسل لكائن تكوين كبير واحد.

نظرًا لأن XmlSerializer يُجري تسلسلًا من/إلى الخصائص العامة، إذا كنت لا ترغب في السماح بتغيير القيم، فقد تحتاج إلى جعل الفئة نفسها غير قابلة للتغيير (نمط المصاصة) أو أن يكون لديك واجهة للقراءة فقط تقع أمام الواجهة التي تم إلغاء تسلسلها.

إنها خدعة مفيدة.يمكنك إعداده عبر ConfigurationManager.AppSettings[] مع قسم التكوين الخاص به ومراجع الملفات الخارجية، أو يمكنك بدلاً من ذلك ترميز اسم ملف xml محدد لكل فئة تكوين.

نلقي نظرة على التكوين.نت - أسهل إطار عمل للتكوين لمطوري .NET.

مكتبة تكوين .NET شاملة وسهلة الاستخدام وقوية، ومغطاة بالكامل باختبارات الوحدة وتم اختبارها ميدانيًا على آلاف الخوادم والتطبيقات.

يمكن أن يكون لديك واجهة تقوم بتعيين الإعدادات المستخدمة في DAL الخاص بك.ثم في التطبيق، يمكنك فقط استخدام IoC لتغذية الإعدادات إلى DAL.

إذا كنت تستخدم إطار عمل DI (مثل Unity)، فيمكنك تحديد وسيطات المُنشئ.لذلك، من الناحية النظرية، يمكن أن يكون لدى موفر DAL الخاص بك مُنشئ يأخذ سلسلة الاتصال الخاصة به.

أعلم أنه لا يمكنك فرض المُنشئات في الواجهات، ولكن هذا شيء يتعين علينا التعامل معه.أعلم أن إطار العمل يحتوي على عدد قليل من الأماكن حيث توجد تبعيات غير معلن عنها على توقيعات المُنشئ ...

القي نظرة على تكوين.يبدو أن هذا يحل ما تبحث عنه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top