0

我正在使用实体框架构建一个 MVC3 应用程序。在应用程序中,我的控制器与服务层通信。其中一个控制器是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();
}

问题是,通过调用它,new SportService()它希望我ISportRepositoryTournamentServiceninject 创建TournamentRepository. 现在我可以执行以下操作:

public IEnumerable<Sport> GetAllSports() {
    ISportService sportService = new SportService(new SportRepository());
    return sportService.GetSports();
}

但问题是每个存储库都需要一个 IContext,它通常也由 ninject 处理。此外,我不希望实例化两个单独的上下文。

我发现自己的一个可能的解决方案是这样做:

private ITournamentRepository _repo;
private ISportService _sportService;

public TournamentService(ITournamentRepository repo, ISportService sportService) {
    _repo = repo;
    _sportService = sportService
}

但是我的TournamentService类中只有一种方法会实际使用,_sportService所以我认为将其作为类属性有点过分。

4

2 回答 2

1

您的最后一个解决方案有效。注入必要的服务作为构造函数的一部分。

如果你担心多个上下文,那么不要让两个单独的上下文被创建。

在您的 Ninject 绑定中:

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

https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope

最后一块是重要的部分。它只会为当前请求创建一个 TournamentRepository 实例。TournamentRepository 的任何其他请求者都将获得此实例。

如果您已经这样做了,那么您已经设置好了,否则,只需添加 InRequestScope 即可。(请记住,您需要参考 Ninject.Web.Common)

希望有帮助。

编辑:

Remo 是正确的,我也不会从服务中调用它。只需从控制器调用您的查找数据并填充您的视图模型。InRequestScope 建议仍然有效。

于 2012-04-23T21:48:06.330 回答
1

保持简单,注入ISportService您的控制器并sportService.GetSports()直接从控制器调用!

于 2012-04-23T22:04:15.853 回答