代码之家  ›  专栏  ›  技术社区  ›  Finglas

具有ioc容器的策略设计模式-ninject

  •  6
  • Finglas  · 技术社区  · 14 年前

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

    该类当前在构造函数中接受四个参数,每个参数表示一个算法。

    如何使用ninject(或通用方法)我仍然可以使用ioc,但使用策略模式?

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

    代码示例:

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

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

    2 回复  |  直到 14 年前
        1
  •  6
  •   Community Erin Dees    7 年前

    让我们退一步,看一个稍微大一点的图片。因为您希望能够在运行时切换策略,所以必须有某种信令机制告诉用户切换策略。如果应用程序是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

        2
  •  3
  •   Jeff Sternal    14 年前

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

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