Pergunta

A minha equipe de desenvolvimento foi executado em uma questão de design. Eu estou esperando que alguém pode me ajudar a limpar esta parte da arquitetura um pouco.

No meu sistema, eu tenho um enum com 250 membros [um membro representa um drop down distinta]. A fim de preencher as listas suspensas em qualquer janela determinada, que forma envia os membros de enumeração que se relacionam com os menus suspensos necessários, e no menu suspenso informações são devolvidas.

Em outras palavras, dizer, por exemplo, temos 3 janelas. Janela A tem queda baixos X, Y e Z. janela B tem queda baixos W, X e Y e janela C tem queda baixos T, U e W. Meu DropDownType enum consistiria de T, U, W, X, Y, Y e Z. Assim, para uma janela especificada, dada a queda baixos nessa janela, eu consulta para que os dados apareçam nas listas suspensas.

Este é um exemplo simplificado, porque o meu aplicativo consiste em> 250 queda baixos distintos.

Como você pode imaginar, eu tenho uma configuração de fábrica para retornar os dados para cada drop-down. E esta fábrica é chamado para cada drop down solicitado.

    switch (dropDownType)
    {
        case DropDownType.T:
            return (from t in dataContext.GetTable<TableOne>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = t.ColumnA,
                                   DropDownValue = t.ColumnB
                               }).ToList();
        case DropDownType.U:
            return (from u in dataContext.GetTable<TableTwo>() 
                    select new DropDownDto 
                               { 
                                   DropDownDisplayName = u.ColumnC,
                                   DropDownValue = u.ColumnD
                               }).ToList();
        // etc...
    }

Desde que eu tenho tantos membros neste enum, alguém sabe de uma maneira mais elegante de codificação isso? Você acha que transformar isso em métodos de fábrica seria útil (mas então teríamos que se preocupar com 250 arquivos separados em nossa fonte ...)? Existe um outro padrão lá fora, que é mais útil? Basta ter esta instrução switch enorme está ficando incontrolável.

Qualquer ajuda é muito apreciada. Agradecemos antecipadamente!

Foi útil?

Solução

Você pode criar um Dictionary<DropDownType, DropDownDtoDelegate> com cada entrada contendo uma entrada enum como uma chave e um delegado para recuperar o drop down de dados como o valor. Isso permitirá que você para manter cada método que retorna uma lista suspensa separar e fora da enorme instrução switch. Você teria, então, um método para recuperar o delegado, executá-lo e devolver o drop down dados da lista.

Outras dicas

Existem algumas soluções para esses problemas.

  1. Você pode usar um dicionário para mapear a partir dos menus suspensos aos seus dados.

  2. Você pode até considerar mover esses dados de mapeamento no banco de dados. A quantidade de dados pode justfy isso esta decisão.

  3. Para remover as chaves adicionais na forma de seu enum pensar em usar os nomes dos menus suspensos como chave.

Aqui é realmente um bom blog lidar com questões relacionadas e sugerindo soluções semelhantes.

Back to Basics - Life After Se, por e Switch - Como, uma Estruturas Lembrete de Dados

Uma opção poderia ser a de usar a reflexão para lidar com o valor enum. Se você tem um padrão de nomenclatura consistente para todas as classes envolvidas, pode haver uma maneira de gerar dinamicamente o nome da tabela / coleção para consulta e o nome do DTO para retornar. Ele vai exigir um pouco de código "overhead" para obtê-lo para o trabalho, mas quando o fizer, ele poderia trabalhar para todas as tabelas diferentes potencialmente.

Gostaria de usar DynamicMethod para gerar código em tempo de execução para cada item na enumeração. Isso deve ser armazenado em cache em um dicionário, e gerado por demanda.

Com um atributo, você pode definir a Entidade usado em cada enum, e esses 2 propriedades necessárias.

Eu posso imaginar em algo assim.

enum DropDownType
{
   [Configuration(Type = typeof(TableOne), DisplayNameProperty = "ColumnA", ValueProperty = "ColumnB")]
   T,

   [Configuration(Type = typeof(TableTwo), DisplayNameProperty = "ColumnC", ValueProperty = "ColumnD")]
   U
}

Quando você tem um valor de enumeração, você verificar o dicionário para o método em cache, se não estiver presente, você gerá-lo.

Usando a reflexão que você obter essas informações sobre propriedade, e com um pouco de habilidade IL, isto pode ser feito facilmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top