2011-01-05 52 views
3

我目前使用Ninject在WCF服务应用程序中创建接口的实例。Ninject - 如何动态选择一个实现绑定到一个接口

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

它很好用,但我们将有几个IObjC的实现。对于IObjA/IObjB的接口继续为实现进行流体分配,但允许为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(); 

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

回答

5

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"); 
+1

2 - 想象一下,你想在不同的机器相同PROGRAMM文件(.exe),读取来自不同数据库或XML(不相同的数据结构)数据S o您需要配置至少在每种情况下使用的DAL。你会怎么做? – Morvader 2012-11-06 12:43:22

+0

你会不会在app.configs中有不同的连接字符串?否则,那将是拥有XML配置的好时机。 – 2012-11-06 18:29:28

相关问题