我正在使用Entity Framework构建MVC3应用程序。在应用程序中,我的控制器与服务层通信。其中一个控制器是TournamentController
,它使用TournamentService
。此服务有一些标准方法,例如CreateTournament
,UpdateTournament
等。
当我想插入一个新锦标赛时,我希望该视图有一个可以组织锦标赛的可能运动的下拉列表。因此,在TournamentController's
Create
方法中,我在ViewBag.Sports
中填写了可能的体育列表。现在我要使用_tournamentService.GetAllSports()
来获取这个体育列表。在GetAllSports()
的{{1}}方法中,我想创建TournamentService
的实例,以便我可以将问题“转发”到正确的服务中。
所有服务都在构造函数中使用依赖注入来注入自己的存储库,如下所示:
SportService
private ITournamentRepository _repo;
public TournamentService(ITournamentRepository repo) {
_repo = repo;
}
中的GetAllSports()
方法如下所示:
TournamentService
问题在于,通过调用public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService();
return sportService.GetSports();
}
,我希望我在new SportService()
中提交ISportRepository
,其中ninject创建TournamentService
。现在我可以做到以下几点:
TournamentRepository
但问题在于每个存储库都需要一个IContext,它通常也由ninject处理。此外,我不希望实例化两个单独的上下文。
我发现自己的一个可行解决方案是:
public IEnumerable<Sport> GetAllSports() {
ISportService sportService = new SportService(new SportRepository());
return sportService.GetSports();
}
但是我的private ITournamentRepository _repo;
private ISportService _sportService;
public TournamentService(ITournamentRepository repo, ISportService sportService) {
_repo = repo;
_sportService = sportService
}
类中只有一种实际使用TournamentService
的方法,所以我觉得将它作为类属性有点过分。
答案 0 :(得分:1)
您的上一个解决方案有效。作为构造函数的一部分注入必要的服务。
如果您担心多个上下文,请不要创建两个单独的上下文。
在你的Ninject绑定中:
Bind<ITournamentRepository>().To<TournamentRepository>().InRequestScope();
请参阅https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope
最后一部分是重要的部分。它只会为当前请求创建一个TournamentRepository实例。 TournamentRepository的任何其他请求者都将获得此实例。
如果您已经这样做了,那么您已经设置了,否则,只需添加InRequestScope就可以了。 (请记住,你需要一个对Ninject.Web.Common的引用)
希望有所帮助。
编辑:
雷莫是正确的,我不会从服务中调用它。只需从控制器调用您的查找数据并填充您的视图模型。 InRequestScope建议仍然存在。
答案 1 :(得分:1)
保持简单,将ISportService
注入您的控制器并直接从控制器调用sportService.GetSports()
!