在不使用LINQ或其他ORM的情况下使用Repository模式是否有意义?我在MONO编写应用程序并使用MySQL,正在考虑使用repositoy模式但不能处理IQueryable。我正在考虑在存储库中公开更多方法,以明确表示过滤将在db端进行存储库调用。任何建议,如果这是对设计或任何其他设计理念的有效使用?
答案 0 :(得分:3)
存储库与IQueryable没有任何关系。您正在考虑的是Rob Conory .net 3.5采用的存储库模式,实际上更像是一种数据代理模式。
存储库负责返回对象,并处理数据访问,以便应用程序的其余部分可以不知道它。
您可以在Martin Fowlers网站
上看到非常高级别的说明答案 1 :(得分:0)
绝对可能。但是您应该将查询移动到存储库站点并为每个类实现一个存储库。例如:
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);
}
}
}
答案 2 :(得分:0)
不确定。存储库只是linq使用的模式。您可以通过它提供任何类型的数据访问。我工作的项目使用处理强类型DataSet的存储库。