Buscar..


Observaciones

Acerca de la implementación de IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter) : La idea de esto es usar Expresiones como i => x.id == 17 para escribir solicitudes genéricas. Es una forma de consultar datos sin utilizar el lenguaje de consulta específico de su tecnología. La implementación es bastante extensa, por lo tanto, es posible que desee considerar otras alternativas, como métodos específicos en sus repositorios implementados: un CompanyRepository imaginario podría proporcionar el método GetByName(string name) .

Repositorios de solo lectura (C #)

Se puede usar un patrón de repositorio para encapsular el código específico de almacenamiento de datos en los componentes designados. La parte de su aplicación que necesita los datos solo funcionará con los repositorios. Querrá crear un repositorio para cada combinación de elementos que almacene y su tecnología de base de datos.

Los repositorios de solo lectura se pueden usar para crear repositorios a los que no se les permite manipular datos.

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

Una implementación de ejemplo utilizando ElasticSearch como tecnología (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;
    }
}

Con esta implementación, ahora puede crear Repositorios específicos para los elementos que desea almacenar o acceder. Cuando se utiliza la búsqueda elástica, es común que algunos componentes solo lean los datos, por lo que se deben usar repositorios de solo lectura.

Patrón de repositorio utilizando Entity Framework (C #)

Interfaz de repositorio;

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

Repositorio genérico;

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

Ejemplo de uso utilizando una clase de hotel de demostración;

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow