Inject different classes that implement the same interface using Ninject

前端 未结 2 776
Happy的楠姐
Happy的楠姐 2021-02-03 11:27

I am implementing the builder design pattern to construct different kinds of graph objects to be displayed on a WPF UI. I am using Ninject as my IOC container. However, I am try

相关标签:
2条回答
  • 2021-02-03 11:47

    If you're just planning to use service location, as in your examples, then named bindings work fine, as per Garys answer.

    A better approach, however, is to use constructor injection, and use attributes. For exampl, from the ninject wiki:

    Bind<IWeapon>().To<Shuriken>().Named("Strong");
    Bind<IWeapon>().To<Dagger>().Named("Weak"); 
    

    ...

    class WeakAttack {
        readonly IWeapon _weapon;
        public([Named("Weak")] IWeapon weakWeapon)
            _weapon = weakWeapon;
        }
        public void Attack(string victim){
            Console.WriteLine(_weapon.Hit(victim));
        }
    }
    

    Based on your comment to Gary, you're (strangely enough) stumbling into territory similar to what I asked a question about a few hours ago. See Remo's answer here: Using WithConstructorArgument and creating bound type

    You would use When condition to define when to create the correct instance.

    0 讨论(0)
  • 2021-02-03 11:53

    I would suggest using Contextual bindings (named bindings specifically) to accomplish this. That way you can do something like:

    // called on app init
    kernel.Bind<IChartBuilder>().To<TemperatureChartBuilder>().Named("TempChartBuilder");   
    kernel.Bind<IChartBuilder>().To<ThresholdChartBuilder().Named("ThreshChartBuilder");
    
    // method X/Y could both call method Z that grabs the correct chart director
    var director = new ChartDirector(kernel.Get<IChartBuilder>("TempChartBuilder"));
    

    Where "TempChartBuilder" could be a variable that tells ninject which binding to resolve. So rather binding on the fly you would resolve on the fly but all binding could be defined up front. Typically IOC containers are stored at the application domain level and only need to be defined once. There may be specific cases where you need to bind dynamically but those should be rare.

    More info on contextual bindings: https://github.com/ninject/ninject/wiki/Contextual-Binding

    0 讨论(0)
提交回复
热议问题