He publicado algunas preguntas a lo largo de los meses sobre la estructura de las aplicaciones ASP.NET y las Capas de abstracción de la base de datos, a los fines de la reescritura (del ground-up), una aplicación web heredada. Recientemente he tropezado con MVC3/Entity-Code-First y después de pasar algún tiempo con él, me he enamorado de cómo funciona, cómo se abstraen las cosas, ¡y estoy buscando cualquier excusa para usarlo!Reescribiendo una aplicación web de propiedad heredada a MVC3/Entity-Code-First
La aplicación heredada es un servicio de Windows C++/CLI que genera su propio HTML (HTML muy antiguo con CSS utilizado solo para colores y abundantes tablas) y con una interfaz muy estrechamente conectada a la lógica de negocios . Básicamente, cualquier cosa va a ser una mejora.
Sin embargo, y quizás esto se deba a que no he pasado suficiente tiempo con MVC, tengo algunas dudas persistentes y me pregunto si algunos de ustedes MVC-Pros podrían enviar su experiencia en mi dirección.
La aplicación legado utiliza controles personalizados (que es la propia forma de ellos) para unir los cuadros de combinación de datos, de forma dinámica y repoblar los cuadros de combinación dependientes en base a las selecciones en otra. En ASP.NET, esta pregunta se responde fácilmente, ya que simplemente arroja un control
asp:DataList
en la página, lo vincula a una fuente de datos y listo. Un poco de código simple le permite luego filtrar otros cuadros combinados en el valor seleccionado. También sería fácil en ASP.NET implementar otra lista de datos que incluso automatice los datos dependientes de esta manera (lo que imitaría muy bien el comportamiento de la aplicación heredada). Parece que no puedo encontrar una noción de controles personalizados en MVC, aunque supongo que este tipo de cosas se manejan mediante llamadas jQuery para obtener datos y colocarlos en un cuadro combinado. Pero, ¿se hace esto para cada cuadro combinado en cada página que tiene uno? ¿Es este un caso de vistas parciales con los parámetros apropiados que se pasan, o esto simplemente estúpido?Supongo que esto se relaciona más con Entity Framework que con MVC, pero la mayoría de los ejemplos que he encontrado en la web y tutoriales, realizan consultas LINQ para devolver una colección de objetos para mostrar, por ejemplo, MvcMovie ejemplo:
public ActionResult Index() { var movies = from m in db.Movies where m.ReleaseDate > new DateTime(1984, 6, 1) select m; return View(movies.ToList()); }
la que se representa a continuación, utilizando un bucle
@foreach
en la vista. Esto es genial La aplicación heredada tiene una sola página de exploración que es utilizada por todas las otras áreas del sistema (hay más de 50). Lo hace inspeccionando el orden de las columnas definido para el usuario que inició sesión, aplanando cualquier clave externa (para que el campo de la tabla externa se muestre en oposición al valor de la clave primaria que no es fácil de usar) y también permite al usuario aplicar filtros personalizados a cualquier columna. Hace esto también para tablas que tienen más de 100k filas. ¿Cómo se podría escribir algo similar usando Entity-framework y views? En ASP.NET probablemente resolvería esto generando dinámicamente una vista de cuadrícula de algún tipo y haciendo que autogenere las columnas y aplique los filtros. Parece que me gustaría más trabajar en MVC. Me falta algo?La aplicación heredada tiene varias operaciones que operan en grandes conjuntos de datos. Ahora, debido a que era un servicio, podría lanzar estos hilos sin preocuparse por el cierre. Una de mis preguntas aquí en SO fue sobre la presencia de administradores estáticos y la introducción de un reciclaje de AppPool, pero he decidido que tener un servicio auxiliar es una buena opción. Dicho esto, la aplicación heredada aplica una declaración de actualización a grandes grupos de registros en lugar de filas únicas. ¿Es esto posible con Entity-Framework sin escribir SQL personalizado contra la base de datos que pasa por alto los modelos normales?Espero que no tenga que hacer algo como esto (no es que lo haría, esto es sólo por ejemplo)
var records = from rec in myTable where someField = someValue select rec; foreach(rec in records) rec.applyCalculation(); db.SaveDbChanges();
Sospecho que esto podría llevar mucho tiempo, mientras que la aplicación de legado que acaba de hacer:
UPDATE myTable SET field1 = calc WHERE someField = someValue
Por lo tanto, no me queda del todo claro cómo utilizamos nuestros modelos de esta manera.
La aplicación heredada tiene algunos paneles de datos en el diseño que se transmiten en cualquier página en la que se encuentre. Mirando aquí en Stackoverflow, encontré this pregunta, lo que implica que cada vista necesita pasar esta información al diseño? ¿Es así o hay una mejor manera? Idealmente, me gustaría que mi diseño pueda acceder a un modelo/repositorio en particular y mostrar los datos en un panel lateral. Agregar a cada página de vista podría ser bastante repetitivo y propenso a error. Por no mencionar el tiempo que tomaría si tuviera que modificar algo. Una vista parcial haría aquí, pero nuevamente no estoy seguro de cómo pasarle un modelo en la página de diseño.
Finalmente, me decepcionó, después de instalar Ef-Code-First, encontrar que un atributo muy bueno,
SourceName
, aún no se ha incorporado. Esto sería muy bueno en el mapeo de las tablas/columnas heredadas y no estoy del todo seguro de por qué se ha dejado de lado en este momento (al menos, mi intellisense dice que no está allí). ¿Alguien ha tenido una idea de cuándo podría ocurrir esto? Podría prescindir de él por un tiempo, pero finalmente sería increíblemente útil.
Disculpe las preguntas largas. Después de años de trabajo de investigación en ASP.NET y MVC3, ¡realmente quiero ir con MVC3!
Lea el título y la última línea ... todo lo demás es demasiada lectura. Dijiste que es muy largo, intenta condensarlo en una pregunta manejable. –
para jQuery cosas con mvc mira aquí http://awesome.codeplex.com/ – Omu