【问题标题】:Binding Ninject depending on Controller requests根据控制器请求绑定 Ninject
【发布时间】:2011-08-20 09:23:33
【问题描述】:

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

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

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

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

但是如果请求是从 SoccerController 进来的,我需要绑定:

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

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

【问题讨论】:

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


    【解决方案1】:

    听起来您可能想要使用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));
    

    【讨论】:

    • 已更新以反映最新版本的 Ninject 及其在 github 上的文档。谢谢鲁本!
    • 谢谢蒂莫西,这几乎正是我想要的,我不确定这是否违反了任何好的做法,因为绑定似乎是“硬编码”的。但是,如果我在每个控制器中启动了一个 TeamList 对象,那么这个绑定是否仍然有效,这样如果我传入 SwimmingRepository 它会列出游泳者,但如果我传入 SoccerRepository 它会列出足球运动员?
    • 我不确定我是否理解这个问题。 TeamList 中的数据不是来自存储库吗?如果是这样,是否要由 SoccerRepository 或 SwimmingRepository 的实现来返回正确的类型?
    • 是的,确实如此……我想我现在只是在转动我的车轮……是时候休息一下了。谢谢蒂莫西!
    【解决方案2】:

    @Timothy Strimple's answer 基本上是正确的(因此我的 +1)除了:

    1. 适用于 Ninject v1 - CodePlex 站点需要消失,因为现在所有内容都将消失 lives on github
    2. 您可以表达这样一个事实,即要使用的绑定取决于通过条件绑定所涉及的控制器 -- there's an example in the wiki

    【讨论】:

    • 感谢您指出这一点。它比 v1 版本优雅得多。
    【解决方案3】:

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

    public SomeController(IRepositoryType repository) {
    }
    

    在NinjectControllerFactory 类中,您将像这样设置绑定:

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

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

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

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

    【讨论】:

    • ...我只是用分号结束了我的句子。我想我需要离开办公桌几分钟。 =/
    • 大声笑我也这样做,在电子邮件和所有内容中!感谢您的回复。这就是我正在寻找的,但有点“动态”的版本
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多