我正在学习Ninject以及如何在MVC情况下实现它。我试图找出设置以下场景的最佳方法/实践。
我有一个团队对象,它将在整个应用程序中重复使用,我需要做的是让Ninject根据请求的来源自动解析绑定。
在我的NinjectController工厂中,我目前有一个服务,可以将团队解析为适当的存储库
Bind<ITeamRepository>().To<SwimTeamRepository>() // non-space characters to enable edit submission
但是如果请求来自SoccerController,我需要绑定:
Bind<ITeamRepository>().To<SoccerTeamRepository>()
如果这是有条件的,请设置单独的服务?这里最好的方法是什么?或者我完全不在这里......
答案 0 :(得分:12)
听起来您可能想要使用contextual binding。如果这没有帮助,也许你可以重新解释这个问题,这样我就可以更好地了解你正在寻找什么。
编辑后更有意义。我不完全确定你的应用程序是如何构建的,但我可能会将ITeamRepository传递给控制器,构造函数看起来像这样。
public SoccerController(ITeamRepository repository)
{
_repository = repository;
}
public SwimmingController(ITeamRepository repository)
{
_repository = repository;
}
然后是绑定:
Bind<ITeamRespository>().To<SoccerRepository>().WhenInjectedInto(typeof(SoccerController));
Bind<ITeamRespository>().To<SwimmingRepository>().WhenInjectedInto(typeof(SwimmingController));
答案 1 :(得分:4)
@Timothy Strimple's answer基本上是正确的(因此我的+1),除了:
答案 2 :(得分:1)
在控制器的构造函数中,您应该传入Ninject将为其提供具体类型的类型的接口或抽象实现。
public SomeController(IRepositoryType repository) {
}
在NinjectControllerFactory
类中,您将拥有如下所示的绑定:
Bind.<IRepositoryType>()
.To<DatabaseRepository>()
;
如果您的具体实现需要构造函数参数,则可以在它们绑定时传递它们。
Bind.<IRepositoryType>()
.To<DatabaseRepository>()
.WithConstructorArgument("connStr",
"some_connection_string_here"
);
希望这能指出你正确的方向。 ;