アプリケーションを可能な限り柔軟にしたいのですが、インターフェイスを具体的にしすぎて穴にはまりたくありません。
リポジトリに最適なオブジェクト タイプは何ですか? IEnumerable、IQueryable、またはリスト?
使用を検討している技術は
Azure App Fabric キャッシュ
エンティティ フレームワーク 4.1
おそらく Windows Server AppFabric
アプリケーションを可能な限り柔軟にしたいのですが、インターフェイスを具体的にしすぎて穴にはまりたくありません。
リポジトリに最適なオブジェクト タイプは何ですか? IEnumerable、IQueryable、またはリスト?
使用を検討している技術は
Azure App Fabric キャッシュ
エンティティ フレームワーク 4.1
おそらく Windows Server AppFabric
エンティティに対して将来のクエリを実行するかどうか、およびこれらをメモリ内に置く必要があるかどうかによって異なります。
IQueryableを使用してDALを構築し、それを渡し、オブジェクトコンテキストの有効期間が要求であることを確認します。このようにすると、実行の遅延のメリットが得られますが、データベースのクエリが非効率になるリスクがあります。
次に、アプリケーション(または少なくともトラフィックを取得する可能性が最も高い部分)のパフォーマンステストを行い、データアクセスパターンを確認します。DALに特殊なメソッドを作成して、完全にマテリアライズされたオブジェクトを取得し、これらのクエリをコンパイル済みのクエリとして作成します。
リポジトリインターフェースのサンプルは次のようになります
public interface IDataContext
{
void Add<T>(T entity) where T : BaseEntity;
void Delete<T>(T entity) where T : BaseEntity;
IQueryable<T> Find<T>(Expression<Func<T, bool>> where) where T : BaseEntity;
}
ここで、BaseEntityはすべてのクラスの基本クラスであり、このクラスはDB内のどのテーブルにもマップされていないようです。
public abstract class BaseEntity
{
public int Id { get; set; }
public DateTime CreateDateTime { get; set; }
public string CreateUser { get; set; }
public DateTime ModDateTime { get; set; }
public string ModUser { get; set; }
public byte[] RowVersion { get; set; }
}
Expression<Func<T, bool>>EFは式を処理してSQLクエリを生成するため、Funcだけでなく、式全体をリポジトリに渡します。通常の使用法は次のとおりです。
ICollection<WFGroup> wgGroups = this.dataContext.Find<WFGroup>((w) => true).ToList();
WFGroupがBaseEntityから派生したクラスである場合、私は通常、遅延読み込みとプロキシを使用し、オブジェクトをコンテキストにデタッチ/アタッチしません。
IEnumerableDAL から (コレクションではなく)のカスタム実装を返す必要がある可能性はどれくらいありますか? (この質問に答えるには、以前のプロジェクトを見て、それらのプロジェクトまたは のプロジェクトの数を数えてくださいyield return。)
答えが「あまりない」場合は、配列を返すICollectionか、配列を返します(クエリ結果が誤って変更されるのを防ぎたい場合)。ピンチで、クエリを変更して結果を「ストリーミング」する必要がある場合customIEnumerableの場合、常に古いメソッドで新しいメソッドを呼び出し、結果を具体化して、古いクライアントとの互換性を保つことができます。