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