为什么我们使用.ToSelf()在ninject背后的主要逻辑是什么

时间:2016-05-19 05:56:03

标签: c# asp.net-mvc dependency-injection ninject inversion-of-control

我正在研究Ninject,因为我在Class" Warrior Module"下面的代码中有一个代码。         我们有类可以理解的类的bindeed接口,但是为什么我们使用带有类SWORD的.ToSelf()         我已经完成谷歌,但我无法得到这背后的确切逻辑......如果我删除线

Bind<Sword>().ToSelf();

代码

//interface
        interface IWeapon
        {
            void Hit(string target);
        }
        //sword class
        class Sword : IWeapon
        {
            public void Hit(string target)
            {
                Console.WriteLine("Killed {0} using Sword", target);
            }
        }

         class Soldier
        {
            private IWeapon _weapon;
            [Inject]
            public Soldier(IWeapon weapon)
            {
                _weapon = weapon;
            }
            public void Attack(string target)
            {
                _weapon.Hit(target);
            }
        }

         class WarriorModule : NinjectModule
        {
            public override void Load()
            {
                Bind<IWeapon>().To<Sword>();

                Bind<Sword>().ToSelf();//why we use .Toself() with self
            }
        }

        static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel(new WarriorModule());

            Soldier warrior = kernel.Get<Soldier>();

            warrior.Attack("the men");

            Console.ReadKey();
        }

1 个答案:

答案 0 :(得分:2)

Ninject允许解析"self-bindable"类型,即使它们没有明确的绑定。

然后默认为

Bind<Foo>().ToSelf()
    .InTransientScope();

注意:

  • ToSelf()绑定相当于Bind<Foo>().To<Foo>()
  • 如果未指定范围,则默认为InTransientScope()。所以,当你写Bind<Foo>().ToSelf();时,它也等同于Bind<Foo>().ToSelf().InTransientScope();

结论

总之,如果您希望它与默认类型不同,那么只有需要为自绑定类型编写绑定,例如:

Bind<Foo>().ToSelf()
    .InRequestScope();

Bind<Foo>().ToSelf()
    .OnActivation(x => x.Initialize());

Bind<Foo>().To<SpecialCaseFoo>();

我还认为在某些时候有(或仍然是)一个选项来停用“自我绑定”自动绑定行为,在这种情况下,Bind<Foo>().ToSelf()也是有意义的。