MVC3を実行している小さなプロジェクトがあります。LINQを使用してデータベースからデータをフェッチします。私は、MVC3に付属している既成の例と同じアーキテクチャ設計でプロジェクトを構築しました。このようなプロジェクトでは、アプリケーションが分割されます。このトピックでは、Model.csファイルに焦点を当てたいと思います。現在、コントローラーごとに1つあるので、例として、HighscoreController.csとHighscoreModels.csがあります。モデルクラスでは、データコンテキストへの参照を持つServiceクラスと、このデータコンテキストを使用してデータベースをクエリするいくつかのメソッドを定義します。これらのメソッドのいくつかが同じクエリを実行しているという問題が発生したため、データベースへのアクセスの中心点を作成したかったので、リポジトリパターンを実装することを考えました。
private IRepository _repository;
public HighscoreService()
: this(new Repository())
{ }
public HighscoreService(IRepository repository)
{
_repository = repository;
}
これで、データベース呼び出しはリポジトリ内で処理され、リポジトリはServiceクラスから_repository参照を介して使用されます。
私のリポジトリは次のように構築されています:
public class Repository : IRepository
{
private MyDataContext _dataContext;
public Repository()
{
_dataContext = new MyDataContext();
}
public Member MemberByName(string memberName)
{
Member member = CompiledQueries.MemberByName(_dataContext, memberName);
return member;
}
}
このリポジトリパターンと組み合わせてDataLoadOptionsを使用しようとすると、直面する問題が発生します。
dataloadoptionsを使用する場合、新しいdataloadoptionsが適用される前に、datacontextに対して以前のクエリを実行してはならないためです。そして、私のリポジトリはすべてのメソッドでデータコンテキストを再利用するため、これはまったく機能しません。私は2つのことを試みてきました。1つは、usingステートメントを使用して、すべてのメソッド内でデータコンテキストを再作成し、データコンテキストが毎回更新されるようにすることです。しかし、リポジトリから結果をモデルにフェッチし直したときに問題が発生し、usingステートメントが終了すると、スコープがリポジトリパターン内で実行されます。つまり、結果を.Count()や。で使用することはできません。データを提供したdatacontextが終了したため、ToList()。また、リポジトリ全体で同じデータコンテキストを使用する別のソリューションを試しました。ただし、dataloadoptionsを使用する各メソッドで新しいインスタンスを作成します。これは非常に汚い感じがしました;)では、リポジトリパターンでDataLoadOptionsを使用する方法について誰かが私に提案を与えることができますか?今説明した問題を避けてください。または、dataloadoptionsを使用して、別の方法を選択するべきではありませんか?ちなみに、DataLoadOptionsを使用する理由は、関連するテーブルからいくつかのデータを取得したいからです。
ちょっとした質問として:上記のコード例では、CompiledQueriesを独自の.csファイル内に配置したことがわかります。これは悪いデザインですか?コンパイルされたクエリをMVCアプリケーションのどこに配置するかについてのガイドラインはありますか?
読んでくれてありがとう、そして私の質問に対するいくつかの答えがあることを願っています;)事前にどうもありがとう。さらに詳しい情報が必要な場合は、お問い合わせください。