Szukaj…


Uwagi

O implementacji IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : Ideą tego jest użycie wyrażeń takich jak i => x.id == 17 do pisania ogólnych zapytań. Jest to sposób na zapytanie danych bez użycia określonego języka zapytań Twojej technologii. Implementacja jest raczej obszerna, dlatego warto rozważyć inne alternatywy, takie jak określone metody w zaimplementowanych repozytoriach: Wyimaginowane CompanyRepository może zapewnić metodę GetByName(string name) .

Repozytoria tylko do odczytu (C #)

Wzorzec repozytorium można wykorzystać do enkapsulacji kodu specyficznego dla przechowywania danych w wyznaczonych komponentach. Ta część aplikacji, która potrzebuje danych, będzie działać tylko z repozytoriami. Będziesz chciał utworzyć repozytorium dla każdej kombinacji przechowywanego elementu i technologii bazy danych.

Repozytoria tylko do odczytu mogą być używane do tworzenia repozytoriów, które nie mogą manipulować danymi.

Interfejsy

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);
}

Przykładowa implementacja wykorzystująca ElasticSearch jako technologię (z 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;
    }
}

Za pomocą tej implementacji możesz teraz tworzyć określone repozytoria dla elementów, które chcesz przechowywać lub do których masz dostęp. Podczas korzystania z wyszukiwania elastycznego powszechne jest, że niektóre komponenty powinny tylko odczytywać dane, dlatego należy używać repozytoriów tylko do odczytu.

Wzorzec repozytorium za pomocą Entity Framework (C #)

Interfejs repozytorium;

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);
}

Ogólne repozytorium;

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);
    }
}

Przykładowe użycie z wykorzystaniem demonstracyjnej klasy hotelowej;

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow