Шаблон репозитория с хранимыми процедурами - PullRequest
5 голосов
/ 04 августа 2011

Я довольно новичок в шаблоне репозитория и внедрении зависимостей. Почти все шаблоны репозитория, с которыми я сталкивался, имеют какой-то метод GetAll (), например:

public interface IRepository<T>
{
    IQueryable<T> GetAll();
    // other CRUD methods here...
}

У меня проблема с реализацией этого интерфейса и метода GetAll (), потому что я вызываю хранимую процедуру, для которой требуется параметр, который изменяется в зависимости от ввода пользователя. Я не хочу добавлять специальный метод к интерфейсу хранилища, например IQueryable<T> GetAll(string input);. Я также не хочу добавлять параметр в конструктор, потому что он выглядит немного грязно для меня:

public class ConcreteRepository : IRepository<Entity>
{
    string _storedProcedureInput;

    public ConcreteRepository(string storedProcedureInput)
    {
        _storedProcedureInput = storedProcedureInput;

    public IQueryable<Entity> GetAll()
    {
        // Call to stored procedure goes here passing in the 
        // _storedProcedureInput variable.
    }
}

Я также использую внедрение зависимостей, поэтому мне нужно добавить динамический ввод в конструктор при связывании:

Bind<IRepository<Entity>>().To<ConcreteRepository>().WithConstructorArgument(?)

Есть предложения?

UPDATE:

Я хотел бы повторно использовать интерфейс IRepository. Например, в одной программе я использую EF4 для реализации метода GetAll (), а в другой программе я использую стандарт ADO.NET для вызова хранимой процедуры, как в примере выше.

Ответы [ 3 ]

5 голосов
/ 20 апреля 2012

вы не можете добавить новый метод в свой IRepository для выполнения пользовательского хранимого процесса:

    /// <summary>
    /// Execute Stored Proc with result set returned.
    /// </summary>
    /// <param name="procName"></param>
    /// <returns>An object resultset</returns>
    T ExecuteCustomStoredProc<T>(string procName, SqlParameter params);

, а в вашей реализации (ConcreteRepository) вы можете поместить эту логику так:

        public T ExecuteCustomStoredProc<T>(string commandName, SqlParameter params)
        {
            return this._repositoryContext.ObjectContext.ExecuteStoreQuery<T>(commandName, params);
        }
5 голосов
/ 04 августа 2011

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

3 голосов
/ 04 августа 2011

Я бы предположил, что если вы используете GetAll с хранимой процедурой, вы упускаете точку.

Пример GetAll, который возвращает IQueryable, выводит задержку выполнения в некоторой форме, но еслиВыполнение вызова хранимой процедуры не приведет к задержке выполнения.

Я бы предложил сохранить функцию GetAll, но как вызов в контексте вашего ORM.Вызовы к хранимым процедурам хранятся как отдельные методы, но возвращают что-то вроде IList<Entity>

...