لماذا يقوم ConfigurationValidator بالتحقق من صحة القيمة الافتراضية لـ ConfigurationProperty حتى لو كان IsRequired صحيحًا؟

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

  •  04-10-2019
  •  | 
  •  

سؤال

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

[ConfigurationProperty("x", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

الآن أضيف القسم الخاص بي مثل هذا:

<mySection x="123" />

سأحصل على هذا الخطأ:

قيمة الخاصية "X" غير صالحة. الخطأ هو: يجب أن يكون طول السلسلة أحرفًا واحدة على الأقل.

إنه يعمل إذا قمت بتغيير خاصية التكوين لتضمين افتراضي مثل هذا:

[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

هذا يعني أن التحقق من التحقق من القيمة الافتراضية حتى لو كان IsRequired صحيحًا. وهذا يعني أيضًا أنه يجب علي تضمين قيم افتراضية وهمية على جميع خصائص بلدي لتمرير التحقق من الصحة على الرغم من أنها لن يتم استخدامها بالفعل.

هل هذا مجرد تصميم سيء أم أن هناك سبب وجيه لهذا السلوك؟

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

المحلول

لقد كان هذا مشكلة من قبل. كان هناك سبب وجيه لهذا ولكن لا يمكنني تذكر التفاصيل.

لا أستطيع أن أتذكر ما إذا كان هذا يعمل ولكن يمكنك محاولة إعلان العقار في المُنشئ حيث يكون NULL هو القيمة الافتراضية.

public class CustomConfigurationSection : ConfigurationSection
{
    public CustomConfigurationSection()
    {
        Properties.Add(new ConfigurationProperty(
            "x",
            typeof(string),
            null,
            null,
            new StringValidator(1),
            ConfigurationPropertyOptions.IsRequired));
    }


    public string X
    {
        get { return (string)this["x"]; }
        set { this["x"] = value; }
    }
}

يرتبط هذا باستخدام القيم الافتراضية والمقاومة ، ولكن حيث تكون القيمة الافتراضية مطلوبة.http://msdn.microsoft.com/en-us/library/system.configuration.ConfigurationProperty(vs.85).aspx#1

تعديل

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

نصائح أخرى

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

لكن، DefaultValue يفعل تنطبق في هذه الحالة ، كما هو الحال عندما يتم إلغاء التخلص من العقار من XML (كما هو الحال ConfigurationValidatorAttribute).

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

حسب فهمي ، هذا السلوك مطلوب للغاية.

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

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