Tenemos un sitio ASP.NET MVC que utiliza abstracciones de Entity Framework con los patrones Repository y UnitOfWork. Lo que me pregunto es cómo otros han implementado la navegación de gráficos de objetos complejos con estos patrones. Déjeme darle un ejemplo de uno de nuestros controladores:Patrón para recuperar gráficos de objetos complejos con Patrón de repositorio con Entity Framework
var model = new EligibilityViewModel
{
Country = person.Pathway.Country.Name,
Pathway = person.Pathway.Name,
Answers = person.Answers.ToList(),
ScoreResult = new ScoreResult(person.Score.Value),
DpaText = person.Pathway.Country.Legal.DPA.Description,
DpaQuestions = person.Pathway.Country.Legal.DPA.Questions,
Terms = person.Pathway.Country.Legal.Terms,
HowHearAboutUsOptions = person.Pathway.Referrers
};
Es un proceso de registro y prácticamente todo lo que cuelga de la clase Persona POCO. En este caso, almacenamos en caché a la persona a través del proceso de registro. Ahora comencé a implementar la última parte del proceso de registro, que requiere acceso a datos más profundos en el gráfico de objetos. Específicamente datos de DPA que cuelgan dentro de País.
El código anterior está simplemente mapeando la información del modelo en un formato más simple para ViewModel. Mi pregunta es: ¿Consideras que esta navegación bastante profunda de las buenas prácticas de los gráficos o abstractas la recuperación de los objetos que se encuentran más abajo en los repositorios?
Gracias, su respuesta ciertamente ha aclarado mi pensamiento. Las respuestas hasta ahora me han ayudado a darme cuenta de que cuando miro mi código me preocupa lo que EF está haciendo detrás de escena para realizar estos gráficos de objetos. Sé que puedo utilizar SQL Profiler para ver qué está sucediendo, pero mi pensamiento inicial es que extraerlo del controlador me dará un mejor control en el futuro si el rendimiento o el requerimiento de entregar estos datos a fuentes remotas se convierte en un requisito. Su sugerencia de una capa de servicio entre los controladores y repositorios es algo que voy a analizar. –
@Daz Lewis - definitivamente. Tenemos una API para nuestro sitio web. Es por eso que tenemos la capa de servicio. Tanto nuestro sitio web como API son "clientes". Esto permite un modelo de programación agradable, fluido (pero ajustado).Por cierto, no TIENES que usar el Analizador de SQL. Hay un método en ObjectQuery llamado .ToTraceString. Usamos esto con el registro, todos nuestros métodos de repositorio depuran esta línea (nivel de información), para que podamos ver lo que se está ejecutando. De todos modos, definitivamente mira en la capa de servicio. Nuestros repositorios son muy simples, eche un vistazo a algunas de mis preguntas para ver cómo lo hice. – RPM1984
"Los controladores no deben causar llamadas directas al servidor de la base de datos", luego de esto su controlador no debe llamar a un repositorio para causar llamadas directas al servidor de la base de datos. Cuando el acceso a una propiedad que se va a cargar de forma diferida no provoca una llamada directa al servidor de la base de datos de la misma forma que su repositorio está causando una llamada directa al servidor de la base de datos. Sí, seguro que causa una llamada al servidor de la base de datos, pero eso es indirectamente a través de su infraestructura usando una herramienta ORM. – adriaanp