EntityFrameworkを使用してMVC3アプリケーションを構築しています。アプリケーションでは、コントローラーはサービスレイヤーと通信します。コントローラの1つは、TournamentController
を使用するTournamentService
です。このサービスにはCreateTournament
、UpdateTournament
などの標準的な方法がいくつかあります。
新しいトーナメントを挿入したい場合は、トーナメントを開催できる可能性のあるスポーツのドロップダウンリストをビューに表示する必要があります。そのため、このTournamentController's
Create
方法でViewBag.Sports
は、可能なスポーツのリストを入力します。今、私が使用しているスポーツのこのリストを取得するために_tournamentService.GetAllSports()
。このGetAllSports()
メソッドでは、TournamentService
のインスタンスを作成してSportService
、質問を適切なサービスに「転送」できるようにします。
すべてのサービスは、コンストラクターで依存性注入を使用して、次のように独自のリポジトリーを注入します。
private ITournamentRepository _repo;
public TournamentService(ITournamentRepository repo) {
_repo = repo;
}
私のGetAllSports()
メソッドは次のTournamentService
ようになります。
public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService();
return sportService.GetSports();
}
問題は、それを呼び出すことによって、ninjectがを作成するのと同じようにnew SportService()
それを渡すことを期待していることです。今、私は次のことができます:ISportRepository
TournamentService
TournamentRepository
public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService(new SportRepository());
return sportService.GetSports();
}
しかし、それに関する問題は、各リポジトリがIContextを予期していることです。これは、通常、ninjectによっても処理されます。さらに、2つの別々のコンテキストをインスタンス化する必要はありません。
私が自分で見つけた可能な解決策は、これを行うことです:
private ITournamentRepository _repo;
private ISportService _sportService;
public TournamentService(ITournamentRepository repo, ISportService sportService) {
_repo = repo;
_sportService = sportService
}
TournamentService
しかし、私のクラスには実際に使用するメソッドが1つしかない_sportService
ので、これをクラス属性にするのは少しやり過ぎだと思います。