我正在研究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();
}
答案 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()
也是有意义的。