Repository Pattern without LINQ or other ORM?

前端 未结 3 1421
花落未央
花落未央 2021-01-21 06:47

Does it makes sense to use the Repository pattern without the use of LINQ or some other ORM? I am writing an application in MONO and using MySQL, was thinking of using the repo

相关标签:
3条回答
  • 2021-01-21 07:08

    Repository has nothing at all to do with IQueryable. What you are thinking of is the Rob Conory .net 3.5 take on the repository pattern, which is actually more of a data broker pattern.

    A repository is responsible for returning objects, and deals with data access so that the rest of your application can remain ignorant of it.

    You can see a very high level description on Martin Fowlers site

    0 讨论(0)
  • 2021-01-21 07:17

    Sure. The repository is simply a pattern used by linq. You can provide any sort of data access you want through it. A project I work on uses repositories that deal with strongly typed DataSets.

    0 讨论(0)
  • 2021-01-21 07:18

    It's absolutely possible. But you should move queries to repository site and implement one repository per class. For example:

    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题