Как мне реализовать конфигурации и настройки? - PullRequest
1 голос
/ 03 февраля 2011

Я пишу систему, которая развернута в нескольких местах, и каждому сайту нужны свои собственные конфигурации и настройки.«Конфигурация» - это именованное значение, которое необходимо для определенного сайта (например, URL базы данных, имя сегмента S3);каждая конфигурация необходима, обычно не существует значения по умолчанию, и обычно оно имеет строковое значение.Параметр является именованным значением, но он просто настраивает поведение системы;он часто числовой или логический, и обычно есть некоторые значения по умолчанию.

До сих пор я использовал файлы свойств или что-то подобное, но это ужасное решение.Несколько раз разработчик добавлял требование для конфигурации, но не добавлял значение в файл для оперативной конфигурации, поэтому новый выпуск прошел все тесты, а затем потерпел неудачу при выпуске в живую.

Лучше, конечнодля каждого файла, который будет скомпилирован - так что, если отсутствует конфигурация или файл неправильного типа, он не пройдет мимо компилятора - и внедрит специфичный для сайта класс в сборку для каждого сайта.Как кости, файл Scala может легко моделировать более сложные значения, особенно списки, но также карты и кортежи.

Недостатком является то, что файлы иногда поддерживаются людьми, которые не являются разработчиками, поэтому он долженбыть довольно понятным, что было преимуществом файлов свойств.(Кто-то объясняет мне конфигурации XML: вся сложность скомпилируемого файла, но риск времени выполнения файла свойств.)

То, что я ищу, - это простой шаблон для определения группы требуемых имен идопустимые значения.Есть предложения?

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Как насчет использования состава Mixin?Поскольку черты применяются справа налево, мы можем:

Определить черты:

свойство по умолчанию:

trait PropertyA {   
   val userName = "default"
   def useUserName() : Unit = {
     println(userName)
   }
}

другое свойство:

trait SomePropertyA extends PropertyA {   
   val userName = "non-default"
   def useUserName() : Unit = {
     println(userName)
   }
}

Определите абстрактный класс со свойством по умолчанию:

trait HasPropertyA {
   val prop : PropertyA = new PropertyA
}

Определите абстрактный класс со свойством не по умолчанию:

trait HasSomeOtherPropertyA extends HasPropertyA {
       override val prop:PropertyA   = new SomePropertyA {}
}

В вашем классе используйте класс по умолчанию:

trait MyClass extends PropertyA {
   doSomethingWith(prop.userName)
}

или в другой ситуации смешайте его с другим свойством:

if(env.isSome) {
   val otherProps = MyClass with HasSomeOtherPropertyA
   doSomethingWith(prop.userName)// userName == non-default! 
}

Подробнее читайте в статье Абстракции масштабируемых компонентов

0 голосов
/ 03 февраля 2011

Хотя Lift по своей сути веб-фреймворк, в нем также есть некоторые утилиты. Одним из них является внедрение зависимостей, см .: http://simply.liftweb.net/index-8.2.html#toc-Section-8.2. Таким образом, вы можете, например, создать базу trait со значениями по умолчанию и затем создать подклассы значений среды Runtime, Development, Test .... И я думаю, что кому-то без знания scala легко поместить в файл override def defaultValue = "new value".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...