Ricerca…


Osservazioni

Informazioni sull'implementazione di IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : L'idea è di usare espressioni come i => x.id == 17 per scrivere richieste generiche. È un modo per interrogare i dati senza utilizzare il linguaggio di query specifico della tua tecnologia. L'implementazione è piuttosto estesa, quindi, si potrebbe prendere in considerazione altre alternative, come i metodi specifici sui vostri repository attuate: Un immaginario CompanyRepository potrebbe fornire il metodo GetByName(string name) .

Repository di sola lettura (C #)

Un modello di repository può essere utilizzato per incapsulare il codice specifico di archiviazione dei dati in componenti designati. La parte della tua applicazione, che ha bisogno dei dati, funzionerà solo con i repository. Dovrai creare un repository per ogni combinazione di elementi che archivi e tecnologia del tuo database.

I repository di sola lettura possono essere utilizzati per creare repository che non sono autorizzati a manipolare i dati.

Le interfacce

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

Un esempio di implementazione che utilizza ElasticSearch come tecnologia (con 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;
    }
}

Utilizzando questa implementazione, è ora possibile creare repository specifici per gli elementi che si desidera archiviare o accedere. Quando si utilizza la ricerca elastica, è normale che alcuni componenti debbano solo leggere i dati, quindi è necessario utilizzare i repository di sola lettura.

Pattern del repository utilizzando Entity Framework (C #)

Interfaccia del repository;

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

Repository generico;

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

Esempio di utilizzo utilizzando una demo hotel class;

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow