No hay manera alrededor de tener escribir la nueva información en alguna parte; la clave es sacarlo del código, para evitar recompilar y volver a implementarlo para un cambio tan trivial.
Algunas buenas opciones son enumerar estos valores en un archivo de configuración XML, o mejor aún, en su base de datos.
Es probable que desee completar un diccionario con esta información, cualquiera que sea la fuente. Esta voluntad:
- Que sea fácil de almacenar en caché
- Hacer para la limpieza, código rápido
Cuando llega el momento de sacar sus datos de configuración en código, que le agregan elementos al diccionario de este modo:
Dictionary<string, IReportCreator> = configDataGetter.GetReportDataFromDB().
ToDictionary(r => r.Name, myReportCreatorFactory(r => r.ReportID))
este ejemplo se supone que consiguen sus datos como entidad objeto de algún tipo, y el uso de una fábrica que utilizaría un strategy pattern para su código que crea repor ts. Hay un montón de maneras en que podrías estar haciendo esto por supuesto.
Supongo que los informes son demasiado extensos, variados y de naturaleza diferente que no se puede simplemente poner sql y diseñar bloque de construcción en la base de datos?
Editar basado en los comentarios de OP:
Ah, Gotcha. Bueno, no sé cuánto tiempo tienes, pero por mucho que introduzcas todo en algún tipo de factory, tienes mejores opciones que tendrás más adelante. Voy a darle algunos pensamientos que con suerte ayudarán, de cosas similares que hice. Cada paso es una mejora en sí mismo, pero también un pequeño paso para realmente separar su lógica de informes de este código de shell. Además, puedo ver que ya sabes lo que estás haciendo y estoy seguro de que sé algo de lo que voy a decir a continuación, pero no sé lo que sabes, y será útil para otros.
Primero, extraiga toda la información del código a db (si no lo ha hecho), y agregará más campos de base de datos (y una tabla o dos) a medida que mejore su configuración.
Puede que ya lo sepas, pero lo mencionaré para otros, para ver el patrón de estrategia que menciono arriba. Puede hacer que la lógica personalizada de cada "función de informe" esté realmente en el constructor de sus diversas clases de estrategia. Todos heredarían de su ReportGenerator base (o lucirían una interfaz IReportGenerator común). Pueden y deben compartir el mismo constructor; los parámetros de informe variables se manejarían mediante un parámetro de tipo diccionario. La implementación del constructor de cada clase sabría los tipos de las variables que se necesitan (desde la configuración de db), y las usaría/usaría en consecuencia.
El siguiente paso podría ser deshacerse de su declaración seleccionada en su fábrica, usando reflection. Debería tener el nombre de la clase como parte de los datos de configuración de informes en el archivo db (y tener un constructor común).
En este punto, la forma de agregar un nuevo informe es bastante clara, aunque debe agregar una nueva clase cada vez. Asi de bueno. Cumple con los principios single responsibility y open-closed.
Ahora, solo queda el paso final de que elimina las clases de su aplicación, por lo que se pueden agregar o editar sobre la marcha. Consulte MEF. Esto es para lo que está hecho. Algunas cosas que puede encontrar en Internet que probablemente no deberían ser son CodeDom (excelente cuando no había nada más, pero MEF es mejor) y las características de compilación como servicio que vienen en .NET 5. MEF es el camino a seguir.
podría considerar el uso de una base de datos para almacenar los valores y escribir una consulta que obtenga lo que necesita. Entonces, todo lo que tiene que hacer es insertar datos con cada nuevo informe. – northpole
@northpole - No estoy seguro si entiendo. Los valores se basan en las selecciones del usuario de las páginas que llamaron a ReportController. –
se refieren a la respuesta de Patrick Karcher. Básicamente, aún necesita administrar la selección del usuario, sin embargo, coloca la asignación en la selección en la base de datos. Entonces tienes un método que responde a un tipo. El método recopila lo que necesita del DB (qué tipo de informe es y qué se debe generar ese informe) y crea el informe en consecuencia. – northpole