gpt4 book ai didi

Ninject - 如何动态选择一个实现来绑定(bind)到接口(interface)

转载 作者:行者123 更新时间:2023-12-02 13:53:03 25 4
gpt4 key购买 nike

我目前正在使用 Ninject 在 WCF 服务应用程序中创建接口(interface)实例。

Bind<IObjA>().To<ObjA>().InRequestScope();
Bind<IObjB>().To<ObjB>().InRequestScope();
Bind<IObjC>().To<ObjC>().InRequestScope();

它工作得很好,但是我们将有多个 IObjC 的实现。我有哪些选项可以继续对 IObjA/IObjB 接口(interface)进行流畅的实现分配,但允许对 IObjC 进行可配置分配?

我找到了related question on SO但我不知道是否可以同时支持流动方法和可配置方法。

例如,我可以对 IObjC 使用 Ninject.extensions.xml,同时继续对 IObjA 和 IObjB 使用上述方法吗?

是否建议对 IObjC 进行条件赋值?这看起来很脏,但同时又显得很简单。

if (condition1)
Bind<IObjC>().To<ObjC1>().InRequestScope();
else if (condition 2)
Bind<IObjC>().To<ObjC2>().InRequestScope();

此外,我知道其他框架(例如 CaSTLe)支持 XML 配置,但我想继续使用 Ninject。

最佳答案

1 - 您对 IObjC 的绑定(bind)与任何其他绑定(bind)无关。无论您在何处、何时或如何绑定(bind)其他服务,都无关紧要。

2 - 您可以使用 XML 扩展,但我想问为什么您认为需要它是可配置的。

3 - 您的条件有 2 种可能性。首先,您希望在启动时做出决定,以确定是在应用程序的整个生命周期中使用 ObjC1 还是 ObjC2。如果是这样,那么您的代码就可以了。但是,如果您想在每次解析绑定(bind)时动态决定使用哪个对象,则需要将条件放入绑定(bind)中,如下所示:

Bind<IObjC>().ToMethod( ctx => condition ? ctx.Kernel.Get<ObjC1>() : ctx.Kernel.Get<ObjC2>() );

或者,您可以使用命名绑定(bind):

Bind<ILog>().ToConstant( LogManager.GetLogger( "Accounting" ) ).Named( "Accounting" );

或“何时”条件来提供帮助:

Bind<ILog>().ToConstant( LogManager.GetLogger( "Background" ) ).When( context => context.Target != null && context.Target.Name == "backgroundLogger" );

关于Ninject - 如何动态选择一个实现来绑定(bind)到接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4606848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com