Design patterns
저장소 패턴
수색…
비고
IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter)
의 구현에 대해 : 이것은 i => x.id == 17
과 같은 표현식을 사용하여 일반적인 요청을 작성하는 것입니다. 기술의 특정 쿼리 언어를 사용하지 않고 데이터를 쿼리하는 방법입니다. 구현은 다소 광범위하기 때문에 구현 된 리포지토리의 특정 메서드와 같은 다른 대안을 고려할 수 있습니다. 상상적인 CompanyRepository
가 GetByName(string name)
메서드를 제공 할 수 있습니다.
읽기 전용 리포지토리 (C #)
저장소 패턴은 지정된 구성 요소에 데이터 저장소 특정 코드를 캡슐화하는 데 사용할 수 있습니다. 응용 프로그램에서 데이터가 필요한 부분은 리포지토리에서만 작동합니다. 저장하는 항목과 데이터베이스 기술의 각 조합에 대한 저장소를 작성해야합니다.
읽기 전용 리포지토리를 사용하여 데이터를 조작 할 수없는 리포지토리를 만들 수 있습니다.
인터페이스들
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);
}
ElasticSearch를 기술로 사용하는 예제 구현 (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;
}
}
이 구현을 사용하여 저장하거나 액세스 할 항목에 대한 특정 리포지토리를 만들 수 있습니다. 탄성 검색을 사용하는 경우 일부 구성 요소에서만 데이터를 읽어야하므로 읽기 전용 리포지토리를 사용해야합니다.
Entity Framework를 사용한 저장소 패턴 (C #)
저장소 인터페이스;
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);
}
일반 저장소;
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);
}
}
데모 호텔 클래스 사용 예제;
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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow