2011-01-29 8 views
7

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!

+0

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. –

+0

para jQuery cosas con mvc mira aquí http://awesome.codeplex.com/ – Omu

Respuesta

3

Si conseguía extraer las preguntas correctamente, entonces esto sería mi respuesta:

  1. Tiene usted razón en su forma de pensar acerca de maestro - detalle menús desplegables (u otros controles, para el caso). Las llamadas jQuery AJAX/JSON (en su mayoría GET) serán lo que necesite. Si solo tiene un menú desplegable en su página, entonces, por supuesto, no necesita ese tipo de interactividad; puede preparar el modelo para él en la acción de su controlador (crea un objeto SelectList).

  2. Aquí es muy probable que termine usando algún tipo de sistema de cuadrícula como jqGrid o Flexigrid. Hacen la mayoría de las cosas relacionadas con el filtrado/búsqueda/consulta. De todos modos, deberá proporcionar acciones de controlador JSON que servirán datos.

  3. Sí, puede ejecutar SQL a través de EF. Hay ExecuteStoreQuery() y ExecuteStoreCommand(). Aquí hay más información sobre los http://msdn.microsoft.com/en-us/library/ee358769.aspx

  4. Puede llamar RenderAction() de la vista y tienen esta acción preparar los datos sobre la demanda (cada vez que lo llaman) y renderizar la vista parcial (o normal) y alimentar a los datos (modelo) a eso. RenderPartial() es un poco más torpe con esto: requiere que el modelo ya esté disponible en la vista en la que llama al RenderPartial(). RenderPartial() nunca regresa a la acción del controlador; solo procesa el HTML definido en la plantilla utilizando el modelo que proporcionó en su llamada desde la vista.

  5. Lamentablemente no sé la respuesta a esto.

HTH

+0

En 4. también tienes la opción de crear una clase base para tus modelos. Esta clase tendría propiedades para los datos que desea que estén disponibles en todas las vistas. Pero prefiero RenderAction() a esto. – mare

+0

¡Gracias por esta respuesta, fue increíblemente útil! –

1

Es posible que no les guste, pero se podría hacer mucho más sentido que acaba de refactorizar la aplicación de C++. Especialmente para el negocio. No hay nada de malo en generar html. Es mucho más fácil refactorizar a html/css moderno que un conjunto de plantillas.

Cuestiones relacionadas