vista ver una todas tablas tabla listar las ejemplos datos consultas como codigos codigo linq-to-sql architecture inversion-of-control datacontext prefetch

linq-to-sql - todas - ver codigo de una vista en sql server



Captación previa de datos con el patrón Linq-to-SQL, IOC y Repository (3)

usando Linq-to-SQL me gustaría recuperar algunos datos.

1) la solución común es tratar con DataLoadOptions , pero en mi arquitectura no funcionará porque:

  • las opciones deben establecerse antes de la primera consulta
  • Estoy usando IOC, por lo que no instanciar directamente el DataContext (no puedo ejecutar código en instanciation)
  • mi DataContext es persistente durante la duración de una solicitud web

2) He visto otra posibilidad basada en cargar los datos y sus hijos en un método, y luego devolver solo los datos (para que el niño ya esté cargado) ver un ejemplo aquí

No obstante, en mi arquitectura, no puede funcionar:

  • Mis consultas salen en cascada de mi repositorio y pueden ser consumidas por muchos servicios que agregarán cláusulas
  • Trabajo con interfaces, las instancias concretas de los objetos linq-to-sql no salen de los repositorios (sí, puedes trabajar con interfaces Y agregar cláusulas)
  • Mis repositorios son genéricos

Sí, esta arquitectura es bastante complicada, pero es genial ya que puedo jugar con el código como lego;)

Mi pregunta es: ¿cuáles son las otras posibilidades para captar previamente una información?


No conozco otras posibilidades, parece que has llevado a LinqToSql a sus límites (sin embargo, puedo estar equivocado).

Creo que tus mejores opciones en este momento son:

  1. Agregue algunos métodos "no genéricos" a su aplicación para manejar solo los escenarios específicos donde desea / necesita una carga ansiosa y no use su infraestructura "normal", "genérica" ​​para esos métodos.
  2. Use un ORM que tenga un soporte más sofisticado para la carga ansiosa y perezosa.

Encontré una solución. Mi respuesta es '' Inyección de dependencia ''.

Generalmente se envía con IOC, y significa que puede hacer que su contenedor IOC administre la inyección de clases en instanciation.

Todo lo que necesito es inyectar una clase CustomDCParameter cuando instaure un DC. Esa clase contendrá las reglas y el constructor las aplicará a todas.


En mi aplicación, quizás utilizo una variación de tu solución potencial n. ° 2. Es algo difícil de explicar pero simplemente: encadenó y diferí la carga diferida en mi modelo con clases perezosas personalizadas para abstraerme de la ejecución diferida específica de LinqToSql que aproveché con IQueryable . Beneficios:

  • Mi modelo de dominio y capa de servicio hacia arriba no necesariamente tienen que depender del proveedor de LinqToSql (puedo intercambiar mi DAL con interfaces si quiero)
  • Mis métodos de servicio pueden y devuelven gráficos de objetos completos con múltiples "puntos de anclaje" para la carga diferida utilizando clases que abstraen una implementación de carga diferida en particular, así que puedo usar Ejecución diferida específica de LinqToSql o alguna otra cosa (por ejemplo, anon delegates otra vez, refiérase a esta respuesta )
  • Puedo mantener resultados IQueryable toda mi aplicación (incluso en la interfaz de usuario si quiero), lo que permite un encadenamiento infinito de consultas LINQ sin tener que preocuparme por el rendimiento.