根据Controller请求绑定Ninject

时间:2011-05-06 18:03:07

标签: c# asp.net-mvc binding ninject

我正在学习Ninject以及如何在MVC情况下实现它。我试图找出设置以下场景的最佳方法/实践。

我有一个团队对象,它将在整个应用程序中重复使用,我需要做的是让Ninject根据请求的来源自动解析绑定。

在我的NinjectController工厂中,我目前有一个服务,可以将团队解析为适当的存储库

Bind<ITeamRepository>().To<SwimTeamRepository>() // non-space characters to enable edit submission

但是如果请求来自SoccerController,我需要绑定:

Bind<ITeamRepository>().To<SoccerTeamRepository>()

如果这是有条件的,请设置单独的服务?这里最好的方法是什么?或者我完全不在这里......

3 个答案:

答案 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),除了:

  1. 它适用于Ninject v1 - CodePlex网站需要立即消失lives on github
  2. 你可以表达这样一个事实,即使用的绑定依赖于通过条件绑定所涉及的控制器 - there's an example in the wiki

答案 2 :(得分:1)

在控制器的构造函数中,您应该传入Ninject将为其提供具体类型的类型的接口或抽象实现。

public SomeController(IRepositoryType repository) {
}

NinjectControllerFactory类中,您将拥有如下所示的绑定:

Bind.<IRepositoryType>()
    .To<DatabaseRepository>()
    ;

如果您的具体实现需要构造函数参数,则可以在它们绑定时传递它们。

Bind.<IRepositoryType>()
    .To<DatabaseRepository>()
    .WithConstructorArgument("connStr",
        "some_connection_string_here"
    );

希望这能指出你正确的方向。         ;