0

EntityFrameworkを使用してMVC3アプリケーションを構築しています。アプリケーションでは、コントローラーはサービスレイヤーと通信します。コントローラの1つは、TournamentControllerを使用するTournamentServiceです。このサービスにはCreateTournamentUpdateTournamentなどの標準的な方法がいくつかあります。

新しいトーナメントを挿入したい場合は、トーナメントを開催できる可能性のあるスポーツのドロップダウンリストをビューに表示する必要があります。そのため、この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ので、これをクラス属性にするのは少しやり過ぎだと思います。

4

2 に答える 2

1

あなたの最後の解決策は有効です。コンストラクターの一部として必要なサービスを注入します。

また、複数のコンテキストが心配な場合は、2 つの別個のコンテキストを作成しないでください。

あなたのNinjectバインディングで:

Bind<ITournamentRepository>().To<TournamentRepository>().InRequestScope();

https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScopeを参照してください

最後のピースが重要な部分です。現在のリクエストに対して TournamentRepository のインスタンスを 1 つだけ作成します。TournamentRepository の他のリクエスタは、このインスタンスを取得します。

すでにこれを行っている場合は設定済みです。それ以外の場合は、InRequestScope を追加するだけで完了です。(Ninject.Web.Common への参照が必要になることに注意してください)

それが役立つことを願っています。

編集:

Remo は正しいです。サービスからこれを呼び出すこともありません。コントローラーからルックアップ データを呼び出して、ビュー モデルに入力するだけです。InRequestScope アドバイスは引き続き有効です。

于 2012-04-23T21:48:06.330 に答える
1

シンプルに保ち、コントローラーに注入ISportServiceし、コントローラーから直接呼び出しますsportService.GetSports()!

于 2012-04-23T22:04:15.853 に答える