Хранилище для извлечения данных


Я создал очень простой репозиторий для некоторых простых извлечения данных и было интересно, если я иду в правильном направлении. У кого-нибудь есть мысли по этому поводу?

интерфейс

public interface IRepository<T> where T : class {
    IEnumerable<T> GetAll();
    T GetById(int id);
    IEnumerable<T> Filter(Expression<Func<T, bool>> filter);
    void Dispose();
}    

класс

public class JobRepository : IRepository<Job>, IDisposable{
    /// <summary>
    /// handles all job data retrieval
    /// crude but will suffice for now
    /// </summary>
    CentralRepositoryContainer _context = null;

    public JobRepository() {
        CentralRepositoryContainer context =
            HttpContext.Current.GetCentralRepositoryContext();
    }

    /// <summary>
    /// returns all jobs
    /// </summary>
    /// <returns>IEnumerable<Job></returns>
    public IEnumerable<Job> GetAll() {
        try {
            return this._context.Jobs;
        } catch (SqlException ex) {
            //error so dispose of context
            this.Dispose();
            //wrap and rethrow back to caller
            throw new CentralRepositoryException("Error getting all jobs", ex);
        }

    }

    /// <summary>
    /// return job
    /// </summary>
    /// <param name="id">integer to search on</param>
    /// <returns>job</returns>
    public Job GetById(int id) {
        try {
            return this._context.Jobs.SingleOrDefault(j => j.JobId == id);
        } catch (SqlException ex) {
            //error so dispose of context
            this.Dispose();
            //wrap and rethrow back to caller
            throw new CentralRepositoryException("Error getting all job by id", ex);
        }
    }

    /// <summary>
    /// filters based on parsed filter expression
    /// </summary>
    /// <param name="filter">filter to search on</param>
    /// <returns>IQueryable<Job></returns>
    public IEnumerable<Job> Filter(System.Linq.Expressions.Expression<Func<Job, bool>> filter) {
        try {
            return this._context.Jobs.Where(filter);
        } catch (SqlException ex) {
            //error so dispose of context
            this.Dispose();
            //wrap and rethrow back to caller
            throw new CentralRepositoryException("Error getting all job by filter", ex);
        }
    }

    public void Dispose() {
        if (this._context != null) {
            this._context.Dispose();    
        }
    }
}


383
4
c#
задан 11 октября 2011 в 01:10 Источник Поделиться
Комментарии
2 ответа

Особенно в таких простых случаях, вы не хотите создать хранилище на эф (я предполагаю, что это эф-но то же самое касается и Linq2SQL) контексте.

В DbContext и в основном это реализация шаблона repository. Ваш репозиторий на вершине просто создает еще один уровень сложности без предоставления какой-либо серьезной выгоды.

В более сложных случаях оборачивать DbContext с определенного интерфейса имеет смысл конечно.

3
ответ дан 11 октября 2011 в 01:10 Источник Поделиться

Я бы расширяют хранилища немного с добавлением нескольких операций в интерфейсе и их реализации, а также делает вашу способность() и фильтр() методы возвращают интерфейс IQueryable вместо того, чтобы (как они запросы):

public interface IRepository<T> where T : class {
IQueryable<T> GetAll();
T GetById(int id);
T GetOne(Expression<Func<T, bool>> filter);
IQueryable<T> Filter(Expression<Func<T, bool>> filter);
int Add(T instance); // returns a unique integer ID for this entity.
void Update(T instance);
void Delete(T instance);
void DeleteById(int id);
void Dispose();
}

Возможно, вы также хотите, чтобы затянуть, что вы храните в репозитории, т. е. не просто 'где T : класс' - сделает ваши классы реализуют интерфейс или спуск от базового класса, который имеет некоторые свойства:

public abstract class BaseEntity {
private int id;

public int Id
{
get
{
return this.id;
}

private set
{
this.id = this.SetId(value);
}
}

protected abstract int SetId(int id);
}

как начать.

3
ответ дан 26 октября 2011 в 02:10 Источник Поделиться