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()それを渡すことを期待していることです。今、私は次のことができます:ISportRepositoryTournamentServiceTournamentRepository
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ので、これをクラス属性にするのは少しやり過ぎだと思います。