2010-03-06 70 views
6

我有一个需要使用策略设计模式的类。在运行时,我需要切换不同的算法以查看对应用程序性能的影响。策略使用IOC容器的设计模式 - Ninject专门为

有问题的类当前在构造函数中有四个参数,每个参数代表一个算法。

如何使用Ninject(或广义方法)我仍然可以使用IOC但使用策略模式?

目前的限制是我的内核(容器)知道每个算法接口,但只能绑定到一个具体的类。我目前唯一能看到的方法是在构造中传递所有八种算法,但使用不同的接口,但这似乎完全没有道理。如果我不使用IOC容器,我不会这样做,所以必须有一些解决方法。

代码示例:

class MyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<Person>().ToSelf(); 
     Bind<IAlgorithm>().To<TestAlgorithm>(); 
     Bind<IAlgorithm>().To<ProductionAlgorithm>(); 
    } 
} 

人需要利用两种算法的,所以我可以在运行时切换。但是只有TestAlgorithm被绑定,因为它是容器中的第一个。

回答

6

让我们退后一步,检查一个稍大的图片。由于您希望能够在运行时切换策略,因此必须有某种告知Person切换策略的信号机制。如果你的应用程序是UI驱动的,可能有一个按钮或下拉列表,用户可以选择使用哪种策略,但即使情况并非如此,一些外部调用者必须地图一段运行时数据到战略的一个实例。

The standard DI solution when you need to map a run-time instance to a dependency is to use an Abstract Factory

而不是注册个人策略与容器,你注册工厂。

完全可以编写一个完整的API,使其成为DI-friendly, but still DI Container-agnostic

+0

这工作得很好。干杯。 – Finglas 2010-03-06 17:34:18

3

如果需要改变在运行时的IAlgorithm实现,你可以改变Person要求的算法工厂提供基于运行时的条件不同的具体算法。

一些依赖注入容器让你绑定到匿名创建代理 - 如果Ninject支持,你可以把决策逻辑放在其中的一个。