首先,我的问题仅适用于 Web 应用程序,我倾向于使用 InRequestScope 解决方案设置我的大部分 Ninject 绑定(bind)。
我正在考虑切换功能的方法,我的一个想法是调用:
kernel.Rebind<IInterface>().To<RealImplementation>().InRequestScope();
当网站仍在运行时,开关已被轻弹。如果我随后决定关闭该功能,我可以调用
kernel.Rebind<IInterface>().To<EmptyImplementation>().InRequestScope();
我的想法是 InRequestScope 会保护任何“进行中”的代码请求,但会允许新请求获得新切换的功能。
有没有人根据经验(或对 Ninject 的更深入理解)知道这是否可行,或者是否会给我带来更多麻烦。我粗略地研究了 MEF,所以如果 Ninject 不是这种情况下完成这项工作的最佳工具,那将是我的下一个停靠点。
最佳答案
一个潜在的问题来源是,虽然内核是线程安全的,但您需要轻按一个开关,否则您将竞相将所有内容切换为运行中请求的原子操作。 (这是原则上的,我没有带着这个问题去review代码)。
话虽如此,但我没有想到会直接导致问题。
但是,如果您可以让自己满意和/或根据已经根据与此类使用相关的竞争条件评估代码的人获得足够强大的保证,这可能是有道理的,但这并不是我的普遍做法听到了。事实上,AutoFac 的设计是这样的,你可以从配置输入构建一个不可变的工厂——明确排除这种类型的事情。出于这个原因,我的直觉是放弃这种方法。
您是否考虑过使用 .ToMethod(ctx=> return/* Toggle-based creation*/)
? (显然,它不像 Rebind
那样直接陈述事情)。这可能是有意义的,这取决于您的实际实现(以及绑定(bind)的复杂性和切换系统的性质)。
关于c# - Ninject Rebind 在运行时,它可以用作功能切换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539189/