Pregunta

utilizando Linq-to-SQL me gustaría obtener previamente algunos datos.

1) la solución común es lidiar 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 instalo directamente DataContext (no puedo ejecutar el código en la instanciación)
  • 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 (por lo que el niño ya está cargado) < a href = "http://www.west-wind.com/weblog/posts/38838.aspx" rel = "nofollow noreferrer"> vea un ejemplo aquí

No obstante, en mi arquitectura, no puede funcionar:

  • Mis consultas salen de mi repositorio en cascada 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 obtener previamente una información?

¿Fue útil?

Solución

En mi aplicación, utilizo quizás una variación de su posible solución # 2. Es algo difícil de explicar pero simplemente: encadeno y diferí la carga lenta en mi modelo con la costumbre clases perezosas para abstraerse de la Ejecución Diferente específica de LinqToSql que aprovecho con IQueryable . Beneficios:

  • Mi capa de Modelo y Servicio de Dominio hacia arriba no necesariamente tiene que depender del proveedor de LinqToSql (puedo cambiar mi DAL con interfaces si quiero)
  • Los métodos de Mi servicio pueden devolver gráficos completos de objetos con múltiples 'puntos de anclaje' para la carga perezosa usando clases que abstraen una implementación de carga perezosa en particular, por lo que puedo usar la ejecución diferenciada específica de LinqToSql u otra cosa (por ejemplo, delegados anon . De nuevo, consulte esta respuesta )
  • Puedo mantener los resultados de IQueryable en mi aplicación (incluso en la interfaz de usuario si lo deseo), permitiendo así un encadenamiento infinito de consultas LINQ sin tener que preocuparme por el rendimiento.

Otros consejos

No estoy al tanto de 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. Agrega algo " no genérico " Métodos a su aplicación para manejar sólo el Escenarios específicos en los que desea / necesita cargar con entusiasmo y no utilice su " normal " ;, " genérico " infraestructura para esos métodos.
  2. Use un ORM que tenga un soporte más sofisticado para la carga ágil y perezosa.

He encontrado una solución. Mi respuesta es ' inyección de dependencia '.

Generalmente se envía con IOC, y significa que puede tener su contenedor de IOC para administrar la inyección de clases en la instanciación.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top