Os comento estoy haciendo un programa para administrar varias tiendas virtuales, de las cuales están en distintos tipos de CMS (Oscommerce, Prestashop, etc), y el programa hace de interfaz para que desde un mismo sitio se puedan controlar ambas.
El caso es que cada vez que quiero usar un CMS u otro tengo que realizar lo siguiente, imaginaros tener que añadir esas lineas por cada CMS que pueda agregar en un futuro para los diferentes apartados, productos, clientes, etc.....
Y teniendo en cuenta que los nombres de las funciones son las mismas veo un atraso el tener que estar haciéndolo de esa manera.
Código C:
Ver original
switch (TipoCMS) { case 1: _DatosSitio = ProductosPrestashop.ListarTodos(); break; case 2: _DatosSitio = ProductosOscommerce.ListarTodos(); break; }
He creado una clase común que incluye las llamadas (que funciona bien):
Código C#:
Ver original
public class Comun{ #region Prestashop protected Datos.Prestashop.Productos ProductosPrestashop; protected Datos.Prestashop.Categorias CategoriasPrestashop; protected Datos.Prestashop.Proveedores ProveedoresPrestashop; #endregion #region Oscommerce protected Datos.Oscommerce.Productos ProductosOscommerce; protected Datos.Oscommerce.Categorias CategoriasOscommerce; protected Datos.Oscommerce.Proveedores ProveedoresOscommerce; #endregion public Comun() { TipoCMS = Convert.ToInt32(row["idSistema"]); switch (TipoCMS) { case 1: ProductosPrestashop = new Datos.Prestashop.Productos(); CategoriasPrestashop = new Datos.Prestashop.Categorias(); ProveedoresPrestashop = new Datos.Prestashop.Proveedores(); break; case 2: ProductosOscommerce = new Datos.Oscommerce.Productos(); CategoriasOscommerce = new Datos.Oscommerce.Categorias(); ProveedoresOscommerce = new Datos.Oscommerce.Proveedores(); break; } } } }
He probado a realizarlo de la siguiente manera (la cual falla):
Código C:
Ver original
string NombreCms = ""; switch (TipoCMS) { case 1: NombreCms = "Prestashop"; break; case 2: NombreCms = "Oscommerce"; break; } dynamic Productos = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("Datos." + NombreCms + ".Productos"); _DatosSitio = Productos.ListarTodos();
Pero me genera un error:
Así que ya no se como poder optimizar el código para no repetir las mismas líneas tantas veces.
Si a alguien se le ocurre alguna manera de realizarlo, estaría muy agradecido.
Nota: La aplicación esta en capas:
- Interfaz:
- Procesado: Donde quiero que actúe de esa manera.
- Datos: La que se conecta a la base de datos de MySQL y hace la consulta.
Imagen de la aplicación: Imagen ejemplo.