9介绍如何在一次调用中解决依赖关系

本文关键字:调用 一次 解决 关系 依赖 | 更新日期: 2023-09-27 17:58:42

我是Ninject的新手,经过一些研究,我想出了一个例子:

public interface IWeapon
{
    void Hit(Target target);
}
public class Sword : IWeapon
{
    public void Hit(Target target)
    {
        //do something here
    }
}
public class Character
{
    private IWeapon weapon;
    public Character(IWeapon weapon)
    {
        this.weapon = weapon;
    }
    public void Attack(Target target)
    {
        this.weapon.Hit(target);
    }
}
public class Bindings : NinjectModule
{
    public overrides void Load()
    {
        Bind<IWeapon>().To<Sword>();
    }
}
public void Main()
{
    Target sometarget = new Target();
    Kernel kernel = new StandardKernel(new Bindings());
    var weapon = kernel.Get<IWeapon>();
    var character = new Character(weapon);
    character.Attack(sometarget);
}

正如您所看到的,为了解决依赖关系,我必须使用Kernel提取IWeapon的实例,并将其传递给Character的构造函数。我觉得这有点难看,我想知道有没有一种方法可以直接拉取Character的实例,而Ninject将自动解决与IWeapon的依赖关系?类似于:

Character character = kernel.Resolve<Character>();

9介绍如何在一次调用中解决依赖关系

默认情况下,Ninject将允许您使用正确的绑定自动解析具体类型。在你的例子中,你可以做:
public void Main()
{
    Target sometarget = new Target();
    IKernel kernel = new StandardKernel(new Bindings());
    //var weapon = kernel.Get<IWeapon>();
    var character = kernel.Get<Character>();
    character.Attack(sometarget);
}

有关更多信息,请阅读Ninject wiki:https://github.com/ninject/ninject/wiki/Dependency-Injection-With-Ninject

您尚未注册Character。创建一个ICharacter接口,并将其绑定到Character类。然后,当您尝试解析ICharacter时,Ninject将看到它需要一个IWeapon实例作为Character构造函数,并且它将获得一个注册到该接口的实例。