Я думаю, что "большой" enum может быть немного неприятным - почему бы вам не разбить их, используя пространства имен;на цитата MSDN :
Обычно лучше определить перечисление непосредственно в пространстве имен, чтобы все классы в пространстве имен могли обращаться к нему с одинаковым удобством.Однако перечисление также может быть вложено в класс или структуру
Таким образом, вы можете иметь:
RediVider.EnterpriseApp.DataAccess.ESettingsKeys
RediVider.EnterpriseApp.BusinessLogic.ESettingsKeys
RediVider.EnterpriseApp.ComponentXXX.ESettingsKeys
Кроме того - вы бы объявляли перечисления или статические поля только для чтения?(где значение является ключом и работает в предположении, что когда вы определяете ключ, вы полностью определяете, откуда он исходит - отсюда и значение ключа).
Лучшей идеей было бы не определятьключ, специфичный для репозитория, но ключ, который сопоставлен с ключом AppSetting - и именно здесь вы определили фактический ключ, специфичный для репозитория.Это позволит вам изменить, где получить «настройку» из - через конфигурацию, без необходимости повторного развертывания приложения.
Итак, у вас есть:
namespace RediVider.EnterpriseApp.DataAccess
{
Public class ESettingsKeys
{
// Note - AppSetting Keys are "namespaced" to match:
public readonly string SetupAllowPublic = "RediVider.EnterpriseApp.DataAccess.SetupAllowPublic";
}
}
Затем вваш конфиг ( псевдо-код ):
<AppSetting Key="RediVider.EnterpriseApp.DataAccess.SetupAllowPublic" value="/System/Settings/Blah/SetupAllowPublic">
Единственная загвоздка в том, что это только помогает разбить ключи на более логичные и облегчить работу с областями - у вас все еще есть проблемаразрешения хранилища.Если вы действительно хотите абстрагироваться от этого, вам нужно сериализовать простой класс, имеющий
Идея оператора switch не так уж и плоха, но вы можете использовать тот же подход и здесь, используя своего рода подход на основе шаблонов Facade или Factory:
- Имеют различные конкретные методы,настройки из хранилища.
- В каждом пространстве имен (согласно перечислениям ESetting) есть метод «GetSettings», который делает то, что вы описали, - но только для параметров, определенных в этом пространстве имен.