次の機能を実装するwpfアプリケーションを構築しています。
提案されたアーキテクチャ:データベース->エンティティフレームワーク->リポジトリ->ビジネスロジック->データサービス-> ViewModel
このアーキテクチャを使用する理由:アプリケーション(複数のビュー)と複数のデータベースに存在する複数のシナリオ。したがって、私は抽象化のために真ん中にリポジトリを使用する用意があります。
注意点の1つは、リポジトリが実装されている場合、コンテキストが長持ちすることです。これを克服するために、コンテキストを作成し、それらを各クラッドメソッドのusing()ブロックに配置しても問題ありませんか?
代わりのアプローチを提案してください。
DbContext
は軽量オブジェクトです。ビジネストランザクションごとに1回使用するように設計されています。DbContext
をシングルトンにしてアプリケーション全体で再利用すると、同時実行性やメモリリークの問題など、他の問題が発生する可能性があります。 。
DbContext
は基本的に作業単位を実装します。それに応じて処理します。
DbContext
はIDisposable
を実装しますが、手動で破棄したり、using
ステートメントでラップしたりしないでください。 DbContext
は自身の寿命を管理します。データアクセスリクエストが完了すると、DbContext
は自動的にデータベース接続を閉じます。
これが事実である理由を理解するために、DbContext
からのエンティティコレクションに対してLinqステートメントを実行するとどうなるかを検討してください。データアクセスメソッドから遅延読み込みIQueryable
を返すと、クライアントが(FirstOrDefault()
、ToList()
またはそれを反復します)。
さらに読む
DbContextオブジェクトで常にDispose()を呼び出す必要がありますか?
Entity Frameworkでシングルトンデータコンテキストを使用しない理由
戻るIEnumerable<T>
対IQueryable<T>
リポジトリがIQueryable
を返す必要がありますか?