【问题标题】:Repository Pattern without LINQ or other ORM?没有 LINQ 或其他 ORM 的存储库模式?
【发布时间】:2011-02-15 21:58:51
【问题描述】:

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

【问题讨论】:

    标签: .net mysql mono repository


    【解决方案1】:

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

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

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

    【讨论】:

    • 您对所有这些都是正确的。我指的是 Rob 的帖子,已经在各处发布,只是想知道我在数据库中进行过滤并返回是否是该模式的有效使用,尽管并不理想。
    • 添加了指向 fowlers 网站的链接。您所描述的是存储库实际上是什么。 Rob 做了一些很酷的东西,但它实际上并不是一个存储库。存储库模式在这一点上已被证明是一种可靠的模式。
    【解决方案2】:

    绝对有可能。但是您应该将查询移至存储库站点并为每个类实现一个存储库。例如:

    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);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多