Несколько вложенных словарей - PullRequest
0 голосов
/ 23 февраля 2012

В моем приложении может быть несколько серверов для подключения. Каждый сервер может иметь больше репозиториев, которые можно открыть в приложении. У меня есть несколько объектов для упаковки логики вызова веб-сервисов в хранилище на конкретном сервере, и они являются синглетонами (это неважно). Приложение обычно обрабатывает 0-5 серверов, на каждом из которых будет 0-5 репо. Количество объектов 5.

Я хочу хранить эти объекты в классе, но

Dictionary<string, Dictionary<string, Dictionary<type, IServiceProvider>>>

кажется немного странным ... Я просто параноик или это действительно плохая идея?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Объявление немного длинное и трудное для чтения, но как таковое, это код ОК.

Для лучшей читабельности и удобства использования подумайте о создании класса или структуры, которая представляет эту структуру и имеет лучшее именование.

2 голосов
/ 23 февраля 2012

Вы можете использовать агрегированные ключи до тех пор, пока вы определите равенство и хеш-код соответствующим образом (или для простоты даже вместо этого используйте структуру):

class ServiceProperties
{
    public int ServerId {get;set;}
    public int RepositoryId {get;set;}
    public type ServiceType {get;set;}

    //define equality, hashcode
}

Теперь вы можете просто использовать Dictionary<ServiceProperties, IServiceProvider>

2 голосов
/ 23 февраля 2012

Зависит. С одной стороны, Dictionary (или другой ассоциативный контейнер) может показаться правильным инструментом для работы. С другой стороны, даже если ваши шаблоны доступа идеально согласованы с такой структурой, вам все равно не требуется производительность ; все структуры данных быстры для такого смехотворно небольшого количества элементов.

Таким образом, если вы на самом деле не все время индексируете это дерево словарей в своем коде, вы можете вместо этого иметь List из них и просто выполнять линейный поиск каждый раз, когда вам нужно:

class Wrapper
{
    public string Server { get; set; }
    public string Repository { get; set; }
    public Type Type { get; set; }
    public IServiceProvider Provider { get; set; }
}

Также вполне возможно, что из-за ваших конкретных шаблонов доступа это может не сделать ваш код более читабельным. Визуализируйте (или прототип) оба подхода и выберите тот, который удобнее использовать.

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