Pregunta

Mi equipo de desarrollo se ha topado con un problema de diseño. Estoy esperando que alguien puede ayudar a limpiar esta parte de la arquitectura un poco.

En mi sistema, tengo una enumeración con 250 miembros [uno de los miembros representa una caída distinta abajo]. Para poblar las listas desplegables en cualquier ventana dada, que forma envía en los miembros de enumeración que se relacionan con los menús desplegables necesarios, y se devuelve el menú desplegable de la información.

En otras palabras, digamos por ejemplo, tenemos 3 ventanas. Ventana A tiene menús desplegables X, Y y Z. Ventana B tiene menús desplegables W, X e Y y la ventana de C tiene menús desplegables T, U y W. Mi enum DropDownType consistiría en T, U, W, X, Y, Y y Z. Así que para una ventana especificada, teniendo en cuenta los menús desplegables en esa ventana, que la consulta para los datos que aparecen en los menús desplegables.

Este es un ejemplo simplificado porque mi aplicación consta de> 250 menús desplegables distintas.

Como se puede imaginar, tengo una configuración de fábrica para devolver los datos para cada menú desplegable. Y esta fábrica se llama para cada desplegables 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 tengo tantos miembros en esta enumeración, ¿alguien sabe de una forma más elegante de la codificación de esta? ¿Considera que esta transformando en métodos de fábrica sería útil (pero entonces tendría que preocuparse alrededor de 250 archivos separados en nuestra fuente ...)? ¿Hay otro patrón por ahí que es más útil? El solo hecho de esta sentencia switch enorme está consiguiendo inmanejable.

Cualquier ayuda es muy apreciada. Gracias de antemano!

¿Fue útil?

Solución

Se puede crear un Dictionary<DropDownType, DropDownDtoDelegate> con cada entrada que contiene una entrada de enumeración como una clave y un delegado para recuperar el menú desplegable de datos como el valor. Esto permitirá mantener cada método que devuelve una lista desplegable separada y fuera de la declaración enorme interruptor hacia abajo. A continuación, tendría un método para recuperar el delegado, ejecutarlo, y regresar el menú desplegable datos de la lista.

Otros consejos

Hay algunas soluciones a estos problemas.

  1. Es posible usar un diccionario para mapear desde los menús desplegables a sus datos.

  2. Usted puede incluso considerar mover estos datos cartográficos en la base de datos. La cantidad de datos puede justfy esta decisión.

  3. Para eliminar las claves adicionales en forma de su enumeración pensar en usar los nombres de los menús desplegables como clave.

Aquí está un muy buen blog de abordar cuestiones relacionadas y sugiriendo soluciones similares.

Volver a lo Básico - La vida después si, por e interruptor - Al igual que, un recordatorio de Estructuras de Datos

Una opción podría ser la de utilizar la reflexión para manejar el valor de enumeración. Si usted tiene un estándar de nomenclatura coherente para todas las clases involucradas, puede haber una manera de generar dinámicamente el nombre de la tabla / recogida para consultar y el nombre de la DTO para volver. Se requerirá un poco de código "gastos generales" para conseguir que funcione, pero una vez que lo hace, podría potencialmente funcionar para todas las diferentes tablas.

Me gustaría utilizar DynamicMethod para generar código en tiempo de ejecución para cada elemento de la enumeración. Esto debe ser almacenado en caché en un diccionario, y genera bajo demanda.

Con un atributo, se puede establecer la Entidad utiliza en cada enumeración, y esas 2 propiedades necesarias.

Me puedo imaginar en algo como esto.

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

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

Cuando usted tiene un valor de enumeración, que compruebe el diccionario para el método de caché, si no está presente, es que generamos.

El uso de la reflexión a obtener esas informaciones de propiedad, y con un poco de habilidad IL, esto se puede hacer fácilmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top