自己创建新对象时的EF4.3依赖注入

时间:2012-04-23 21:35:59

标签: asp.net-mvc-3 entity-framework dependency-injection ninject dbcontext

我正在使用Entity Framework构建MVC3应用程序。在应用程序中,我的控制器与服务层通信。其中一个控制器是TournamentController,它使用TournamentService。此服务有一些标准方法,例如CreateTournamentUpdateTournament等。

当我想插入一个新锦标赛时,我希望该视图有一个可以组织锦标赛的可能运动的下拉列表。因此,在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的方法,所以我觉得将它作为类属性有点过分。

2 个答案:

答案 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()