アルバハリは「一言で言えばc#4.0」と書いています。
> DataContext / ObjectContextはIDisposableを実装しますが、(一般的に)インスタンスを破棄せずに逃げることができます。破棄すると、コンテキストの接続が強制的に破棄されますが、クエリから結果を取得し終えるたびにL2SとEFが自動的に接続を閉じるため、通常は不要です。<<
これは間違っていると感じ、IDisposableであるものを処分していない場合、FxCopも文句を言います。
私は次のリポジトリコードを持っています:
public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{ ...
public void Add(TEntity entity)
{
using (var dbContext = this.UnityContainer.Resolve<DbContext>())
{
dbContext.Set<TEntity>().Add(entity);
dbContext.SaveChanges();
}
}
...
public virtual IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> expression)
{
using (var dbContext = this.UnityContainer.Resolve<DbContext>())
{
return dbContext.Set<TEntity>().Where(expression).ToList().AsEnumerable();
}
}
...
注:IQueryableを返しません-遅延読み込みは役割を果たさないはずです。ResolveDbContextはPerResolveLifetimeManagerとして構成されています。
このアプローチは大丈夫ですか、それともアルバハリスの説明に基づいてこれを再考する必要がありますか?