首先,我的问题仅适用于网络应用,我倾向于使用InRequestScope分辨率设置我的大部分Ninject绑定。
我正在考虑如何进行功能切换,而且我认为我要打电话:
kernel.Rebind<IInterface>().To<RealImplementation>().InRequestScope();
当网站仍在启动并运行时,交换机已被轻弹。如果我然后决定关闭该功能,我可以打电话
kernel.Rebind<IInterface>().To<EmptyImplementation>().InRequestScope();
我的想法是InRequestScope会保护任何“进行中”代码请求,但会允许新请求获得新切换的功能。
有没有人从经验(或对Ninject更深入的了解)知道这是否可行,或者是否会给我带来更多麻烦。我已经表面上看了MEF,如果在这种情况下Ninject不是最好的工具,那么它将成为我的下一个停靠点。
答案 0 :(得分:0)
一个潜在的问题来源是,虽然内核是线程安全的,但您需要轻弹单个交换机,否则您将竞争将所有内容切换为正在进行的请求的原子操作。 (原则上,我没有考虑到这个问题的代码)。
话虽如此,但没有任何想法可以直接导致问题。
但是,如果您能够满足自己和/或根据基于与此类使用相关的竞争条件评估代码的人获得足够强大的保证,那么这可能是有意义的,这不是我普遍的做法听到了。实际上,AutoFac的设计是这样的,你可以从Configuration输入构建一个不可变的工厂 - 特别是排除这种类型的东西。因为这个原因,我的本能是改变这种做法。
您是否考虑过使用.ToMethod(ctx=> return /* Toggle-based creation*/)
? (显然它并没有像Rebind
那样直接说明事情)。根据您的真实意图(以及您的绑定和切换系统的性质的复杂性),这可能是有道理的。