Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IOC容器的策略设计模式-Ninject_C#_Design Patterns_Ioc Container_Ninject_Strategy Pattern - Fatal编程技术网

C# 使用IOC容器的策略设计模式-Ninject

C# 使用IOC容器的策略设计模式-Ninject,c#,design-patterns,ioc-container,ninject,strategy-pattern,C#,Design Patterns,Ioc Container,Ninject,Strategy Pattern,我有一个课程需要使用策略设计模式。在运行时,我需要切换不同的算法以查看对应用程序性能的影响 当前讨论的类在构造函数中有四个参数,每个参数表示一个算法 我如何使用Ninject(或广义方法)仍然使用IOC,但使用策略模式 当前的限制是,我的内核(容器)知道每个算法接口,但只能绑定到一个具体类。目前我能看到的唯一解决方法是在构建时传入所有八种算法,但使用不同的接口,但这似乎完全没有必要。如果我没有使用IOC容器,我不会这么做,所以一定有办法解决这个问题 代码示例: class MyModule :

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

当前讨论的类在构造函数中有四个参数,每个参数表示一个算法

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

当前的限制是,我的内核(容器)知道每个算法接口,但只能绑定到一个具体类。目前我能看到的唯一解决方法是在构建时传入所有八种算法,但使用不同的接口,但这似乎完全没有必要。如果我没有使用IOC容器,我不会这么做,所以一定有办法解决这个问题

代码示例:

class MyModule : NinjectModule 
{
    public override void Load() 
    {
        Bind<Person>().ToSelf();
        Bind<IAlgorithm>().To<TestAlgorithm>();
        Bind<IAlgorithm>().To<ProductionAlgorithm>();
    }
}
类MyModule:Ninject模块
{
公共覆盖无效负载()
{
Bind().ToSelf();
绑定()到();
绑定()到();
}
}

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

如果需要在运行时更改
IAlgorithm
实现,可以更改
Person
以要求一个算法工厂,该工厂根据运行时条件提供不同的具体算法


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

让我们退一步,看一个更大的图。因为您希望能够在运行时切换策略,所以必须有某种信号机制告诉用户切换策略。如果应用程序是UI驱动的,可能会有一个按钮或下拉列表,用户可以在其中选择要使用的策略,但即使不是这样,一些外部调用方也必须将一段运行时数据映射到该策略的实例

这个

您注册工厂,而不是在容器中注册单个策略

完全有可能编写一个完整的API,以使其更简单