Поиск…


замечания

О реализации IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : Идея состоит в том, чтобы использовать выражения, такие как i => x.id == 17 для написания общих запросов. Это способ запроса данных без использования конкретного языка запросов вашей технологии. Реализация довольно обширна, поэтому вы можете рассмотреть другие альтернативы, такие как конкретные методы в ваших реализованных репозиториях: воображаемый CompanyRepository может предоставить метод GetByName(string name) .

Репозитории только для чтения (C #)

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

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

Интерфейсы

public interface IReadOnlyRepository<TEntity, TKey> : IRepository
{
    IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter);

    TEntity Get(TKey id);
}

public interface IRepository<TEntity, TKey> : IReadOnlyRepository<TEntity, TKey>
{
    TKey Add(TEntity entity);

    bool Delete(TKey id);

    TEntity Update(TKey id, TEntity entity);
}

Пример реализации с использованием ElasticSearch в качестве технологии (с помощью NEST)

public abstract class ElasticReadRepository<TModel> : IReadOnlyRepository<TModel, string>
    where TModel : class
{

    protected ElasticClient Client;

    public ElasticReadRepository()
    {
        Client = Connect();
    }

    protected abstract ElasticClient Connect();

    public TModel Get(string id)
    {
        return Client.Get<TModel>(id).Source;
    }

    public IEnumerable<TModel> Get(Expression<Func<TModel, bool>> filter)
    {
        /* To much code for this example */
        throw new NotImplementedException();
    }
}

public abstract class ElasticRepository<TModel>
    : ElasticReadRepository<TModel>, IRepository<TModel, string>
    where TModel : class
{
    public string Add(TModel entity)
    {
        return Client.Index(entity).Id;
    }

    public bool Delete(string id)
    {
        return Client.Delete<TModel>(id).Found;
    }

    public TModel Update(string id, TModel entity)
    {
        return Connector.Client.Update<TModel>(
            id,
            update => update.Doc(entity)
        ).Get.Source;
    }
}

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

Шаблон репозитория с использованием Entity Framework (C #)

Интерфейс репозитория;

public interface IRepository<T>
{
    void Insert(T entity);
    void Insert(ICollection<T> entities);
    void Delete(T entity);
    void Delete(ICollection<T> entity);
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate);
    IQueryable<T> GetAll();
    T GetById(int id);
}

Общий репозиторий;

public class Repository<T> : IRepository<T> where T : class
{
    protected DbSet<T> DbSet;

    public Repository(DbContext dataContext)
    {
        DbSet = dataContext.Set<T>();
    }

    public void Insert(T entity)
    {
        DbSet.Add(entity);
    }

    public void Insert(ICollection<T> entities)
    {
        DbSet.AddRange(entities);
    }

    public void Delete(T entity)
    {
        DbSet.Remove(entity);
    }

    public void Delete(ICollection<T> entities)
    {
        DbSet.RemoveRange(entities);
    }

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public IQueryable<T> GetAll()
    {
        return DbSet;
    }

    public T GetById(int id)
    {
        return DbSet.Find(id);
    }
}

Пример использования с использованием класса демонстрационного отеля;

var db = new DatabaseContext();
var hotelRepo = new Repository<Hotel>(db);

var hotel = new Hotel("Hotel 1", "42 Wallaby Way, Sydney");
hotelRepo.Insert(hotel);
db.SaveChanges();


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow