سؤال

متابعة لسؤالي الأخير بشأن الكائنات الكبيرة والمعقدة كنتيجة لخدمة الويب.لقد كنت أفكر في كيفية التأكد من أن جميع الفئات الفرعية المستقبلية قابلة للتسلسل إلى XML.

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

ومع ذلك، لإجراء تسلسل إلى XML، فأنا ببساطة أقوم بتزيين الفصل وأعضائه بملف اكس ام ال؟؟؟ صفات ( XmlRoot , XmlElement إلخ) ثم تمريره إلى XmlSerializer و أ StringWriter للحصول على السلسلة.وهو كل شيء جيد.أنوي وضع طريقة إرجاع السلسلة إلى طريقة فائدة عامة لذلك لا داعي للقلق بشأن الكتابة وما إلى ذلك.

وهذا الذي يهمني هو هذا:إذا لم أقم بتزيين الفصل (الفصول) بالسمات المطلوبة، فلن يتم ظهور خطأ حتى وقت التشغيل.

هل هناك أي طريقة لفرض زخرفة السمة؟هل يمكن القيام بذلك مع FxCop؟ (لم أستخدم FxCop بعد)

تحديث:

آسف للتأخير في الاقتراب يا رفاق، هناك الكثير للقيام به!

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

إجراء 1+ إلى الأشخاص الآخرين للحصول على اقتراحات مماثلة :)

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

المحلول

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

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

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}

نصائح أخرى

يمكنك كتابة اختبارات الوحدة للتحقق من هذا النوع من الأشياء - فهي تستخدم الانعكاس بشكل أساسي.

نظرًا لحقيقة أن هذا ممكن، أعتقد أنه سيكون من الممكن أيضًا كتابة قاعدة FxCop، لكنني لم أفعل شيئًا كهذا من قبل.

يمكنك كتابة قاعدة FxCop أو حتى التحقق من السمات عن طريق استدعاء GetType() في مُنشئ الفئة الأساسية والتفكير في النوع الذي تم إرجاعه.

إحدى قواعد FXCop الجيدة (والتي أجد أنني بحاجة إليها الآن) هي التحقق من أن جميع الكائنات التي تتم إضافتها إلى جلسة ASP.NET لها السمة القابلة للتسلسل.أحاول الانتقال من حالة جلسة InProc إلى SQL Server.في المرة الأولى التي طلبت فيها صفحة، انفجر موقعي بسبب تخزين كائنات غير قابلة للتسلسل في الجلسة.ثم جاءت مهمة البحث في جميع التعليمات البرمجية المصدر عن كل مثيل يتم فيه تعيين كائن في الجلسة...سيكون FXCop حلاً جيدًا.شيء للعمل عليه...

يمكنك أيضًا استخدام هذا المفهوم/المعالج اللاحق لفرض العلاقات بين السمات واستخدام تسجيل دخول مماثل لفرض العلاقات بين الفئات والسمات في وقت الترجمة:

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92

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