Suche…


Bemerkungen

IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) zur Implementierung des IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : Die Idee davon ist die Verwendung von Ausdrücken wie i => x.id == 17 zum Schreiben allgemeiner Anforderungen. Es ist eine Möglichkeit, Daten abzufragen, ohne die spezifische Abfragesprache Ihrer Technologie zu verwenden. Die Implementierung ist ziemlich umfangreich, daher sollten Sie andere Alternativen in Betracht ziehen, z. B. bestimmte Methoden in Ihren implementierten Repositorys: Ein imaginäres CompanyRepository kann die Methode GetByName(string name) bereitstellen.

Schreibgeschützte Repositorys (C #)

Ein Repository-Muster kann verwendet werden, um datenspeicherungsspezifischen Code in bestimmten Komponenten einzukapseln. Der Teil Ihrer Anwendung, der die Daten benötigt, funktioniert nur mit den Repositorys. Sie sollten ein Repository für jede Kombination von Artikel, die Sie speichern, und Ihre Datenbanktechnologie erstellen.

Schreibgeschützte Repositorys können zum Erstellen von Repositorys verwendet werden, die keine Daten bearbeiten dürfen.

Die Schnittstellen

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

Beispielimplementierung mit ElasticSearch als Technologie (mit 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;
    }
}

Mit dieser Implementierung können Sie jetzt spezifische Repositorys für die Elemente erstellen, die Sie speichern oder abrufen möchten. Bei der elastischen Suche sollten einige Komponenten nur die Daten lesen. Daher sollten schreibgeschützte Repositorys verwendet werden.

Repository-Muster mit Entity Framework (C #)

Repository-Schnittstelle;

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

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

Beispiel für die Verwendung einer 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow