私は永続化レイヤーをリファクタリングして真の汎用リポジトリを使用することに取り組んでおり、さまざまなテーブルで実行される同様のクエリの数を最小限に抑えたいと考えています.テーブルa、b、またはcからIDで取得するなどのクエリのみテーブルによって異なります。
これまでの私のリポジトリは次のようになります。
public interface IRepository<T>
{
void Insert(T entity);
void Update(T entity);
}
public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
/// ctor stuff omitted ...
public void Insert(TEntity entity)
{
_db.Insert<TEntity>(entity);
}
public void Update(TEntity entity)
{
_db.Update<TEntity>(entity);
}
}
public interface IDerivedRepository : IRepository<MyEntity>
{
// defines interface methods not found on the base IRepository
}
public class DerivedRepository : BaseRepository<MyEntity>, IDerivedRepository
{
// implements methods defined on IDerivedRepository, and inherits Insert and Update from BaseRepository
}
これは、新しいリポジトリが基本リポジトリで定義されたメソッドを継承できるという点でうまく機能します。これは、エンティティを送信するだけで、ORM (NPoco) が挿入/更新を管理するという点で型に依存しません。
これを拡張して、単純な get/fetch タイプ メソッドの一般的な基本定義を許可したいと考えています。id による get または単純なカウントが明らかな例です。現時点では、これらを適切なリポジトリに実装しているため、基本的に同じコードを呼び出す複数のリポジトリ メソッド (別々のリポジトリ内) になります。
以下の例は単純化されています (_db はスコープなどを管理します) が、私が避けようとしていることを強調しています - テーブルと戻り値の型が異なる GetById メソッドの繰り返し
public class DerivedRepositoryA : BaseRepository<A>, IDerivedARepository
{
public A GetById(int id) {
return _db.Fetch<A>("select * from TableA where id = @0", id);
}
}
public class DerivedRepositoryB : BaseRepository<B>, IDerivedBRepository
{
public B GetById(int id) {
return _db.Fetch<B>("select * from TableB where id = @0", id);
}
}
public class DerivedRepositoryC : BaseRepository<C>, IDerivedCRepository
{
public C GetById(int id) {
return _db.Fetch<C>("select * from TableC where id = @0", id);
}
}
それは可能ですか、どうすればそれを実行できますか?