سؤال

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

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

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

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

(ملاحظة:أنا لست كثيرا من مبرمج من ذوي الخبرة, كما سوف يكون لاحظت.ولكن أحب أن أتعلم!وبالطبع كنت قد فعلت البحث في هذا الموضوع, ولكن أنا حقا تبحث عن بعض التجارب المباشرة)

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

المحلول

هل يمكن استخدام مارتن Fowlers ServiceLocator نمط.في php يمكن أن تبدو مثل هذا:

class ServiceLocator {
  private static $soleInstance;
  private $globalSettings;

  public static function load($locator) {
    self::$soleInstance = $locator;
  }

  public static function globalSettings() {
    if (!isset(self::$soleInstance->globalSettings)) {
      self::$soleInstance->setGlobalSettings(new GlobalSettings());
    }
    return self::$soleInstance->globalSettings;
  }
}

الإنتاج الخاص بك التعليمات البرمجية ثم تهيئة خدمة تحديد المواقع من هذا القبيل:

ServiceLocator::load(new ServiceLocator());

في اختبار رمز إدراج الخاص بك وهمية-إعدادات مثل هذا:

ServiceLocator s = new ServiceLocator();
s->setGlobalSettings(new MockGlobalSettings());
ServiceLocator::load(s);

إنه مستودع ووحدانية التي يمكن تبادلها لأغراض الاختبار.

نصائح أخرى

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

أولا إنشاء فئة عامة من شأنها أن نماذج بلدي ConfigurationItem.

public class ConfigurationItem<T>
{
    private T item;

    public ConfigurationItem(T item)
    {
        this.item = item;
    }

    public T GetValue()
    {
        return item;
    }
}

ثم إنشاء فئة يعرض الجمهور ثابت للقراءة فقط متغيرات التكوين البند.أنا هنا مجرد قراءة ConnectionStringSettings من ملف التكوين ، الذي هو مجرد xml.بالطبع لمزيد من البنود ، يمكنك قراءة القيم من أي مصدر.

public class ConfigurationItems
{
    public static ConfigurationItem<ConnectionStringSettings> ConnectionSettings = new ConfigurationItem<ConnectionStringSettings>(RetrieveConnectionString());

    private static ConnectionStringSettings RetrieveConnectionString()
    {
        // In .Net, we store our connection string in the application/web config file.
        // We can access those values through the ConfigurationManager class.
        return ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ConnectionKey"]];
    }
}

ثم عندما أحتاج ConfigurationItem للاستخدام ، أسميها مثل هذا:

ConfigurationItems.ConnectionSettings.GetValue();

وسوف يعود لي نوع آمنة القيمة التي لا يمكن بعد ذلك ذاكرة التخزين المؤقت أو فعل ما أريد.

هنا عينة الاختبار:

[TestFixture]
public class ConfigurationItemsTest
{
    [Test]
    public void ShouldBeAbleToAccessConnectionStringSettings()
    {
        ConnectionStringSettings item = ConfigurationItems.ConnectionSettings.GetValue();
        Assert.IsNotNull(item);
    }
}

ويساعد هذا الأمل.

عادة ما يكون هذا هو التعامل معها من قبل ini ملف XML أو ملف التكوين.ثم لديك فقط فئة يقرأ الإعداد عند المساعدة.

.صافي هذا بنيت في مع ConfigurationManager الطبقات ، ولكن من السهل جدا لتنفيذ ، فقط قراءة الملفات النصية أو تحميل XML إلى DOM أو تحليل لهم باليد في التعليمات البرمجية.

وجود ملفات التكوين في قاعدة البيانات حسنا, ولكن لا يمكنك ربط إلى قاعدة البيانات ، ويخلق إضافية dependancy على التطبيق الخاص بك أن ini/ملفات xml حل.

أنا فعلت هذا:

public class MySettings
{
    public static double Setting1
        { get { return SettingsCache.Instance.GetDouble("Setting1"); } }

    public static string Setting2
        { get { return SettingsCache.Instance.GetString("Setting2"); } }
}

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

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