c# - مكان تخزين معلومات التكوين




.net configuration (3)

أجد أنه كلما كان لي للتعامل مع نظام إرث، والتمسك مع الشكل القديم يعمل دائما تقريبا أفضل. في كثير من الأحيان هناك أشخاص آخرين يستخدمون الأشكال القديمة للمهام الأخرى (مثل أتمتة التطبيق، على سبيل المثال)، لذلك إذا قمت بإعادة صياغة الطريقة التي يتعامل بها التطبيق مع المدخلات، يمكنك كسر أنظمة أخرى.

من ناحية أخرى، إذا كنت واثقا جدا بأنك تعرف كل الناس الذين يستخدمون النظام، وأنهم يقولون لك أنهم لا يهتمون إذا قمت بتغيير هذه الأنواع من الأشياء، وأنا ربما نقل كل شيء إلى شمل. إلى جانب كل الميزات لطيفة من شمل من وجهة نظر تطبيق (مثل يجري في أسي لذلك يتم تعديلها بسهولة من قبل البشر، ويجري التوثيق الذاتي، الخ ...)، شمل هو أيضا توفير الوقت، في أن لم يكن لديك لكتابة I / O الخاصة بك أو محلل. هناك بالفعل مجموعة واسعة من المكتبات هناك، ولا سيما في .NET 3.0 / 3.5، أن تفعل بشكل جيد للغاية. (كما كنت تتحرك إلى C #، وأنا التخمين كنت تفكر بالفعل على طول هذه الخطوط :)

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

حظا طيبا وفقك الله!

لدي تطبيق وحدة التحكم التي أنا إعادة البناء من C إلى C #. هذا التطبيق يجب أن تكون قادرة على دعم الطريقة القديمة لتخزين المعلومات مثل المعلمات من سطر الأوامر والمعلمات من ملف (تسمى معلمات النظام) التي تخصيص كل تشغيل. ملف المعلمات النظام هو في نص عادي مع مفتاح بسيط: بنية القيمة.

أسئلتي هي:

  • هل يجب دمج هذه المعلمات المختلفة في كائن تكوين واحد؟
  • كيف يمكنني استدعاء كائن التكوين هذا من التعليمات البرمجية لتخزين المعلمات؟
  • كيف يمكنني استدعاء كائن التكوين هذا من التعليمات البرمجية لاسترداد المعلمات؟
    • هل يجب كتابة هذا الكائن بقوة؟
  • وسوف تحتاج إلى الوصول إلى هذا الهيكل من الكثير من الأماكن المختلفة في التعليمات البرمجية، ما هي الطريقة الأكثر أناقة لاسترداد القيم في الكائن دون تمرير الكائن نفسه في كل مكان؟

لدي شعور بأنه يجب أن يكون كائن واحد مكتوب بشكل قوي وأنه يجب أن يكون كائن مثبت يتم استرجاعه من مستودع مع أسلوب استرجاع ثابت ولكن أنا حقا تريد التحقق من صحة هذه الطريقة.

شكرا مقدما


زملدوكومنت - يمكنك إنشاء تعريف فئة باستخدام XSD.exe


وأود استخدام كائن تكوين واحد مثل ما يلي:

using System;
using System.IO;
using System.Reflection;
public sealed class Setting {
  public static int FrameMax { get; set; }
  public static string VideoDir { get; set; }
  static readonly string SETTINGS = "Settings.ini";
  static readonly Setting instance = new Setting();
  Setting() {}
  static Setting() {
    string property = "";
    string[] settings = File.ReadAllLines(SETTINGS);
    foreach (string s in settings)
      try {
        string[] split = s.Split(new char[] { ':' }, 2);
        if (split.Length != 2)
          continue;
        property = split[0].Trim();
        string value = split[1].Trim();
        PropertyInfo propInfo = instance.GetType().GetProperty(property);
        switch (propInfo.PropertyType.Name) {
          case "Int32":
            propInfo.SetValue(null, Convert.ToInt32(value), null);
            break;
          case "String":
            propInfo.SetValue(null, value, null);
            break;
        }
      } catch {
        throw new Exception("Invalid setting '" + property + "'");
      }
  }
}

بما أن هذا هو سينغلتون ، فإنه سيتم إنشاء مثيل واحد فقط في حد ذاته في المرة الأولى يتم الإشارة إلى خاصية public static من كائن Setting .

عند إنشاء الكائن، يقرأ من الملف Settings.ini . ملف الإعدادات هو ملف نص عادي مع key : value بسيط key : value بنية key : value التي قد تبدو كما يلي:

FrameMax : 12
VideoDir : C:\Videos\Best

يستخدم الكائن انعكاس لاكتشاف كل خاصية وتخزين قيمته الأولية. في هذا المثال، تم تعريف خاصيتين:

    public static int FrameMax { get; set; }
    public static string VideoDir { get; set; }

التعليمات البرمجية كما هو مكتوب يعالج Int32 وأنواع String . بإضافة بيانات case إضافية إلى بيان switch ، يمكنك بسهولة إضافة دعم لأنواع مثل Float Decimal .

لتغيير أحد الإعدادات، يمكنك استخدام شيء مثل:

Setting.FrameMax = 5;

لاسترداد أحد الإعدادات، يمكنك استخدام شيء مثل:

if (Setting.FrameMax > 10) ...

ستلاحظ أن جميع الخصائص مكتوبة بقوة. أيضا، لم يكن لديك لتمرير كائن Setting حولها، وجميع خصائص Setting هي static ودائما المتاحة في كل مكان.

آمل أن تكون هذه الفكرة مفيدة.







configuration