具有IOC容器的策略设计模式 - 具体为Ninject

时间:2010-03-06 13:50:25

标签: c# design-patterns ioc-container ninject strategy-pattern

我有一个课程需要使用策略设计模式。在运行时,我需要切换不同的算法,以查看对应用程序性能的影响。

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

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

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

代码示例:

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

如果您需要在运行时更改IAlgorithm实现,可以将Person更改为需要算法 factory ,该算法根据运行时提供不同的具体算法条件。

一些依赖注入容器允许您绑定到匿名创建委托 - 如果Ninject支持,您可以将决策逻辑放在其中一个。