6

首先,我的问题仅适用于 Web 应用程序,我倾向于使用 InRequestScope 分辨率设置我的大部分 Ninject 绑定。

我正在考虑进行功能切换的方法,我的一个想法是致电:

kernel.Rebind<IInterface>().To<RealImplementation>().InRequestScope();

当网站仍在运行时,开关已被轻弹。如果我决定关闭该功能,我可以打电话

kernel.Rebind<IInterface>().To<EmptyImplementation>().InRequestScope();

我的想法是 InRequestScope 将保护任何“正在进行的”代码请求,但将允许新请求获得新切换的功能。

有没有人从经验(或对 Ninject 的更深入了解)中知道这是否可行,或者是否会给我带来更多麻烦。我表面上看过 ​​MEF,所以如果 Ninject 在这种情况下不是完成这项工作的最佳工具,那将是我的下一个停靠点。

4

1 回答 1

0

一个潜在的问题来源是,虽然内核是线程安全的,但您需要轻弹一个开关,否则您将竞相将所有内容作为飞行中请求的原子操作进行切换。(这是原则上,我没有考虑到这个问题来审查代码)。

话虽如此,没有什么可以直接导致问题。

但是,虽然如果您能够满足自己和/或根据与此类使用相关的竞争条件评估代码的人获得足够强的保证,这可能是有意义的,但这并不是我听说的普遍做法。事实上,AutoFac 的设计就是让您从配置输入构建一个不可变的工厂——特别是排除这种类型的事情。出于这个原因,我的直觉是放弃这种方法。

你考虑过使用.ToMethod(ctx=> return /* Toggle-based creation*/)吗?(显然它没有像 a 那样直接说明事情Rebind)。根据您的实际 impl(以及绑定的复杂性和切换系统的性质),这可能是有道理的。

于 2012-09-22T06:54:34.000 回答