Mi è stato assegnato un nuovo progetto e ho deciso di dare EF a go.In questo progetto tutto ciò che faccio è ottenere dati non c'è persistenza. Devo implementare un po 'di cache e basta.
Leggendo i pattern del repository ho trovato tonnellate di campioni di codice, ecc ... mi sembrano tutti sbagliati. Implementano una entità Entity to Repository.
Nel mio progetto ho solo bisogno di leggere i dati non salvando ecc ... solo leggendo. Ho 100s entità che non riesco a creare un repository 100s sembra tutto sbagliato.
Ho deciso di iniziare in modo semplice e ho bisogno di questo:
public interface IRepository : IDisposable
{
IEnumerable<T> GetAll<T>() where T : class;
IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class;
T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class;
}
public class Repository : IRepository
{
public IEnumerable<T> GetAll<T>() where T : class
{
return ???.ToArray();
}
public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
{
return ???.Where(predicate).ToArray();
}
public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
{
return ???.Where(predicate).FirstOrDefault();
}
public void Dispose()
{
throw new NotImplementedException();
}
}
Quello con cui sto combattendo è dove metto "???" quello dovrebbe essere il mio IdbSet.
Come posso implementare il mio repository concreto? Qualsiasi suggerimento o campione di test di noddy farà.
grazie molto
Innanzitutto, è necessario modificare i GetAll()
e Find()
per restituire IQueryable<T>
anziché IEnumerable<T>
, in modo che ulteriori query sul set di dati vengano implementate utilizzando le entità Linq-to-Entities.
A partire dall'implementazione EF, prova qualcosa del genere:
public class EFRepository : DbContext, IRepository
{
// ctor:
// pass a full connecting-string, or "name=someName" from configuration
public EFRepository(string connectionStringOrName) : base(connectionStringOrName)
{
// init sets
this.Entities1 = this.Set<EntityOfSomeType>();
this.Entities2 = this.Set<EntityOfOtherType>();
}
public IEnumerable<T> GetAll<T>() where T : class
{
return this.Set<T>().ToArray();
}
public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
{
return this.Set<T>().Where(predicate).ToArray();
}
public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
{
return this.Set<T>.FirstOrDefault(predicate);
}
public void Dispose()
{
base.Dispose();
}
// Your DbSets...
public IDbSet<EntityOfSomeType> Entities1 { get; set; }
public IDbSet<EntityOfAnotherType> Entities2 { get; set; }
}
(Ho usato DbContext
con l'ipotesi che stai andando in codice prima)