En el contexto de la aplicación n-tier, ¿hay alguna diferencia entre lo que usted consideraría que son sus clases de acceso a datos y sus repositorios?Repositorio vs Acceso a datos
Tiendo a pensar que sí pero solo quería ver qué otro pensamiento. Mi opinión es que el trabajo del repositorio es solo contener y ejecutar la consulta en bruto, donde la clase de acceso a datos crearía el contexto, ejecutaría el repositorio (pasando en el contexto), manejaría el mapeo del modelo de datos al modelo de dominio y devolver el resultado nuevamente ...
¿Qué piensan? ¿Ves también algo de esto cambiando en un escenario de Linq a XML (suponiendo que cambias el contexto para el XDocument relevante)?
Saludos Anthony
ACTUALIZACIÓN:
Ésta es la manera que yo hubiera típicamente implementado con anterioridad cosas:
public class TermBl : ITermBl
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Any pre business logic
var dataLayer = this.CreateDataLayer();
var result = dataLayer.GetAll(criteria);
//Any post business logic
return result;
}
... Other methods
}
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Linq query
var dataResult = ....ToList()
var mappedResult = this.FromDataToDomain(dataResult);
//Note the mapping isn't done in this object, the actual
// mapping is handled by a separate component
return mappedResult;
}
... Other methods
}
, ¿existen otras problemas inherentes aquí con el patrón en general ..
En cuanto al repositorio en el que he estado pensando utilizarlo, en lugar de tener la consulta directamente en GetAll de TermDa método que cambiaría que se vea algo más parecido a esto:
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
var repository = this.CreateRepository();
var dataResult = repository.GetAll(..., criteria).ToList();
var mappedResult = this.FromDataToDomain(dataResult);
return mappedResult;
}
... Other methods
}
public class TermRepository : ITermRepository
{
public IQueryable<ITerm> GetAll(IMyContext context, IListParameter criteria)
{
//Linq query
return ...;
}
... Other queries
}
¿Es así como ustedes lo ven trabajando o no realmente ... Con o sin el repositorio veo cualquiera de los anteriores totalmente la protección de la capa de negocio de saber algo sobre los métodos de acceso a los datos/tecnología utilizada ...
¿Ves un objeto DAL utilizando un objeto de repositorio? es decir, cuando diga la emisión de consultas, creo que lo haría llamando al repositorio ... casi como el repositorio es un proxy para los procesos almacenados en una base de datos, excepto que las consultas están en el repositorio ... –
@vdh_ant: No , un DAL generalmente no tiene ningún conocimiento del modelo de dominio. La implementación de un repositorio (no su interfaz/tipo de base) podría usar el DAL, aunque la mayoría de los proyectos nuevos de hoy en día ni siquiera tienen un DAL, todo está encapsulado en un ORM.El repositorio ** no ** es un proxy para los objetos de la base de datos, ha entendido mal de qué se trata. – Aaronaught
@Aaronaught: poniendo el repositorio por un lado, cuando dices "DAL generalmente no tiene ningún conocimiento del modelo de dominio" esto va en contra de lo que he visto en el lugar ... pensando desde una perspectiva de interfaz/contrato el DAL tiene que devolver algo y principalmente he visto que algo es el modelo de dominio. Cuando pienso en qué más podría ser, solo podrían ser los modelos de datos ... Hubiera pensado que esto era malo por varias razones. Principalmente porque su capa de lógica de negocios ahora está acoplada a un modelo de datos que es específico para diferentes tecnologías ... –