根据控制器请求绑定 Ninject

本文关键字:绑定 Ninject 请求 控制器 | 更新日期: 2023-09-27 17:55:25

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

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

在我的NinjectController工厂中,我目前有一个服务,可以将团队解析到其正确的存储库

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

但是,如果请求来自足球控制器,我需要绑定:

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

是否应该有条件地这样做,设置单独的服务?这里最好的方法是什么?还是我在这里完全偏离了轨道...

根据控制器请求绑定 Ninject

听起来您可能想要使用上下文绑定。如果这没有帮助,也许你可以改写这个问题,这样我就可以更好地了解你正在寻找什么。

这在编辑后更有意义。我不完全确定您如何构建应用程序,但我可能会将 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));

@Timothy Strimple的答案基本上是正确的(因此我的+1),除了:

  1. 它适用于Ninject v1 - CodePlex站点需要消失,因为现在一切都存在于github上。
  2. 你可以通过条件绑定来表达这样一个事实,即要使用的绑定依赖于所涉及的控制器——维基中有一个例子

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

public SomeController(IRepositoryType repository) {
}

NinjectControllerFactory类中,你将按如下方式设置绑定:

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

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

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

希望这为您指明了正确的方向。 ;