Design patterns
Förvaringsmönster
Sök…
Anmärkningar
Om implementeringen av IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter)
: Idén med detta är att använda uttryck som i => x.id == 17
att skriva generiska förfrågningar. Det är ett sätt att fråga data utan att använda teknikens specifika frågespråk. Implementeringen är ganska omfattande, därför kanske du vill överväga andra alternativ, som specifika metoder på dina implementerade förvar: Ett imaginärt CompanyRepository
kan tillhandahålla metoden GetByName(string name)
.
Skrivskyddslager (C #)
Ett förvaringsmönster kan användas för att kapa in datalagringsspecifik kod i utsedda komponenter. Den del av din applikation som behöver uppgifterna fungerar bara med förvaren. Du vill skapa ett arkiv för varje kombination av objekt du lagrar och din databasteknologi.
Skyddslager kan användas för att skapa förråd som inte får manipulera data.
Gränssnitten
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);
}
Ett exempel på implementering med ElasticSearch som teknik (med 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;
}
}
Med hjälp av denna implementering kan du nu skapa specifika förvar för de objekt du vill lagra eller komma åt. När man använder elastisk sökning är det vanligt att vissa komponenter bara ska läsa informationen, så att skrivskyddslager bör användas.
Förvaringsmönster med hjälp av Entity Framework (C #)
Förvar gränssnitt;
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);
}
Generiskt förvar;
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);
}
}
Exempel på användning av en demohotellklass;
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();