Шаблон репозитория без LINQ или другого ORM? - PullRequest
3 голосов
/ 15 января 2009

Имеет ли смысл использовать шаблон Repository без использования LINQ или какого-либо другого ORM? Я пишу приложение в MONO и использую MySQL, думал об использовании шаблона repositoy, но не собираюсь иметь дело с IQueryable. Я думал о том, чтобы просто показать больше методов в репозитории, чтобы было очевидно, что фильтрация будет происходить на стороне базы данных при вызове репозитория. Какие-нибудь предложения, если это - правильное использование дизайна или любые другие идеи дизайна вместо этого?

Ответы [ 3 ]

3 голосов
/ 15 января 2009

Репозиторий не имеет ничего общего с IQueryable. Вы думаете о том, чтобы Rob Conory .net 3.5 использовал шаблон репозитория, который на самом деле является скорее шаблоном брокера данных.

Репозиторий отвечает за возвращение объектов и занимается доступом к данным, так что остальная часть вашего приложения может не знать об этом.

Вы можете увидеть описание очень высокого уровня на Martin Fowlers site

0 голосов
/ 15 января 2009

Конечно. Репозиторий - это просто шаблон, используемый linq. Вы можете предоставить любой вид доступа к данным, который вы хотите через него. В проекте, над которым я работаю, используются репозитории, имеющие дело со строго типизированными наборами данных.

0 голосов
/ 15 января 2009

Это абсолютно возможно. Но вы должны перенести запросы на сайт репозитория и реализовать один репозиторий на класс. Например:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...