.net - pattern - Patrón de repositorio sin LINQ u otro ORM?
patron repositorio php (3)
El repositorio no tiene nada que ver con IQueryable. Lo que estás pensando es que Rob Conory .net 3.5 adopta el patrón de repositorio, que en realidad es más un patrón de intermediario de datos.
Un repositorio es responsable de devolver los objetos, y se ocupa del acceso a los datos para que el resto de la aplicación pueda permanecer ignorante.
Puede ver una descripción de alto nivel en el sitio de Martin Fowlers
¿Tiene sentido utilizar el patrón Repositorio sin el uso de LINQ u otro ORM? Estoy escribiendo una aplicación en MONO y usando MySQL, estaba pensando en usar el patrón de repositorio pero no voy a poder manejar IQueryable. Estaba pensando en exponer más métodos en el repositorio para que fuera obvio que el filtrado iba a suceder en el lado de db con la llamada al repositorio. ¿Alguna sugerencia si ese es un uso válido del diseño o cualquier otra idea de diseño en su lugar?
Es absolutamente posible. Pero debe mover las consultas al sitio del repositorio e implementar un repositorio por clase. Por ejemplo:
public abstract class GenericRepository : IRepository {
public virtual T Get<T>(Identity id) where T : PersistentDocument {
using (IDbConnection connection = GetConnection())
using(IDbCommand command = CreateGetCommand(id, connection)) {
using (IDataReader reader = command.ExecuteReader()) {
var mapper = DaHelper.GetMapper<T>();
return mapper.Map(reader);
}
}
}
protected virtual IDbCommand CreateGetCommand(Identity id, IDbConnection connection) {
IDbCommand command = connection.CreateCommand();
command.CommandText = String.Format("SELECT * FROM {0} e WHERE e.id = ?", TableName);
command.Parameters.Add(id.ToGuid());
return command;
}
protected abstract string TableName { get; }
}
public class UserRepository: GenericRepository<User>, IUserRepository
{
protected override string TableName { get { return "users"; } }
public User GetByEmail(string email)
{
using (IDbConnection connection = GetConnection())
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = String.Format("SELECT * FROM {0} e WHERE e.email = ?", TableName);
command.Parameters.Add(email);
using (var reader = command.ExecuteReader())
return DaHelper.GetMapper<T>().Map(reader);
}
}
}
Por supuesto. El repositorio es simplemente un patrón usado por linq. Puede proporcionar cualquier tipo de acceso a datos que desee a través de él. Un proyecto en el que trabajo utiliza repositorios que tratan con DataSets fuertemente tipados.