我目前正在使用 Ninject 在 WCF 服务应用程序中创建接口实例。
Bind<IObjA>().To<ObjA>().InRequestScope();
Bind<IObjB>().To<ObjB>().InRequestScope();
Bind<IObjC>().To<ObjC>().InRequestScope();
它工作得很好,但我们将有几个 IObjC 的实现。我有哪些选项可以继续对 IObjA/IObjB 接口进行流畅的实现分配,但允许对 IObjC 进行可配置分配?
我找到了一个SO的相关问题 https://stackoverflow.com/questions/2147798/options-for-wiring-dependencies-with-ninject但我不知道是否可以同时支持流动方法和可配置方法。
例如,我可以对 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 的绑定与任何其他绑定无关。您在何处、何时或如何绑定其他服务并不重要。
2 - 您可以使用 XML 扩展,但我会问为什么您认为需要它是可配置的。
3 - 您的条件有 2 种可能性。首先,您希望在启动时做出决定,以确定是在应用程序的整个生命周期中使用 ObjC1 还是 ObjC2。如果是这样,那么您的代码就可以了。但是,如果您想在每次解析绑定时动态决定使用哪个对象,则需要将条件放入绑定中,如下所示:
Bind<IObjC>().ToMethod( ctx => condition ? ctx.Kernel.Get<ObjC1>() : ctx.Kernel.Get<ObjC2>() );
或者,您可以使用命名绑定:
Bind<ILog>().ToConstant( LogManager.GetLogger( "Accounting" ) ).Named( "Accounting" );
或“何时”条件来帮助:
Bind<ILog>().ToConstant( LogManager.GetLogger( "Background" ) ).When( context => context.Target != null && context.Target.Name == "backgroundLogger" );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)