Zoeken…


Opmerkingen

Over de implementatie van IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : Het idee hiervan is om Expressions zoals i => x.id == 17 te gebruiken om generieke verzoeken te schrijven. Het is een manier om gegevens op te vragen zonder de specifieke zoektaal van uw technologie te gebruiken. De implementatie is vrij uitgebreid, daarom wilt u misschien andere alternatieven overwegen, zoals specifieke methoden op uw geïmplementeerde repositories: een denkbeeldige CompanyRepository zou de methode GetByName(string name) kunnen bieden.

Alleen-lezen opslagplaatsen (C #)

Een repository-patroon kan worden gebruikt om gegevensopslagspecifieke code in toegewezen componenten in te kapselen. Het deel van uw applicatie dat de gegevens nodig heeft, werkt alleen met de repositories. U wilt een repository maken voor elke combinatie van items die u opslaat en uw database-technologie.

Alleen-lezen opslagplaatsen kunnen worden gebruikt om opslagplaatsen te maken die geen gegevens mogen manipuleren.

De interfaces

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

Een voorbeeldimplementatie met ElasticSearch als technologie (met 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;
    }
}

Met deze implementatie kunt u nu specifieke repositories maken voor de items die u wilt opslaan of openen. Bij elastisch zoeken is het gebruikelijk dat sommige componenten alleen de gegevens lezen, dus alleen-lezen opslagplaatsen moeten worden gebruikt.

Repository-patroon met Entity Framework (C #)

Repository-interface;

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

Generieke repository;

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

Voorbeeld gebruik met behulp van een demo hotelklasse;

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow