3

在不使用 LINQ 或其他 ORM 的情况下使用存储库模式是否有意义?我正在用 MONO 编写一个应用程序并使用 MySQL,正在考虑使用存储库模式,但无法处理 IQueryable。我正在考虑在存储库上公开更多方法,以明确过滤将在数据库端通过存储库调用进行。如果这是对设计或任何其他设计理念的有效使用,有什么建议吗?

4

3 回答 3

3

存储库与 IQueryable 完全无关。您正在考虑的是 Rob Conory .net 3.5 采用存储库模式,这实际上更像是一种数据代理模式。

存储库负责返回对象,并处理数据访问,以便您的应用程序的其余部分可以保持对它的无知。

您可以在Martin Fowlers网站上看到非常高级别的描述

于 2009-01-15T13:07:35.080 回答
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);
        }
    }
}
于 2009-01-15T13:26:37.383 回答
0

当然。存储库只是 linq 使用的一种模式。您可以通过它提供任何类型的数据访问。我从事的一个项目使用处理强类型数据集的存储库。

于 2009-01-15T13:41:16.883 回答