Ninject Rebind 在运行时,可以用作功能切换吗?
Posted
技术标签:
【中文标题】Ninject Rebind 在运行时,可以用作功能切换吗?【英文标题】:Ninject Rebind at runtime, can it be used as a feature toggle? 【发布时间】:2012-09-14 09:17:52 【问题描述】:首先,我的问题仅适用于网络应用程序,我倾向于使用 InRequestScope 分辨率设置我的大部分 Ninject 绑定。
我正在考虑实现功能切换的方法,我的一个想法是调用:
kernel.Rebind<IInterface>().To<RealImplementation>().InRequestScope();
当网站仍在运行时,开关已轻弹。如果我决定关闭该功能,我可以打电话
kernel.Rebind<IInterface>().To<EmptyImplementation>().InRequestScope();
我的想法是 InRequestScope 将保护任何“进行中”的代码请求,但允许新请求获得新切换的功能。
有没有人根据经验(或对 Ninject 的更深入了解)知道这是否可行,或者是否会给我带来更多麻烦。我对 MEF 进行了粗略的了解,因此如果 Ninject 在这种情况下不是完成这项工作的最佳工具,那将是我的下一个停靠点。
【问题讨论】:
【参考方案1】:一个潜在的问题来源是,虽然内核是线程安全的,但您需要轻弹一个开关,否则您将竞相将所有内容作为飞行中请求的原子操作进行切换。 (这是原则上,我没有考虑到这个问题审查代码)。
话虽如此,但没有想到会直接导致问题。
但是,如果您可以满足自己和/或根据与此类使用相关的竞争条件评估代码的人获得足够有力的保证,这可能是有意义的,但这并不是我所普遍采用的做法听到了。事实上,AutoFac 的设计就是让您从配置输入构建一个不可变的工厂——特别是排除这种类型的事情。出于这个原因,我的直觉是放弃这种方法。
您是否考虑过使用 .ToMethod(ctx=> return /* Toggle-based creation*/)
? (显然它没有像Rebind
那样直接说明事情)。根据您的实际 impl(以及您的绑定的复杂性和切换系统的性质),这可能是有道理的。
【讨论】:
嗯,很有趣。因此,如果我正确地跟随您,您的想法是用 rebind 代替 .ToMethod ,其中代码可以在每次调用的基础上验证条件(例如,是否设置了标志)。我认为这不会导致任何性能开销,因为我的假设是 Ninject 绑定每个调用而不是缓存返回结果。在这种情况下,我将检查 azure 存储,因此会有检查惩罚,但这可能会被缓存 x 可接受的时间。 @Dylan 这样的简单语义可能可以用Provider 来表达(缓存可能通过 DI 进行管理并且只是代码)。话又说回来,一个简单的静态方法可能符合要求...以上是关于Ninject Rebind 在运行时,可以用作功能切换吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asp.net Web 窗体上实现 Ninject 或 DI?
Ninject 在使用 NinjectHttpModule 时创建一个额外的实例