我使用Ninject和MVC3来自动注入构造函数参数。它运作得很好。
你如何做与非MVC代码类似的事情。
例如:
public class Ninja
{
private readonly IWeapon _weapon;
public Ninja(IWeapon weapon)
{
_weapon = weapon;
}
public void Strike()
{
_weapon.Strike();
}
}
public class MyProgram
{
public void DoStuff()
{
var Ninja = new Ninja(); // I'm wanting Ninject to call the parameterized Ninja constructor
ninja.Strike();
}
}
如何更改代码才能使其正常工作?
答案 0 :(得分:5)
public interface IWeapon
{
void Strike();
}
public class Sword : IWeapon
{
public void Strike()
{
Console.WriteLine("black ninja strike");
}
}
public class Ninja
{
private readonly IWeapon _weapon;
public Ninja(IWeapon weapon)
{
_weapon = weapon;
}
public void Strike()
{
_weapon.Strike();
}
}
public class WarriorModule : NinjectModule
{
public override void Load()
{
Bind<IWeapon>().To<Sword>();
}
}
class Program
{
static void Main()
{
var kernel = new StandardKernel(new WarriorModule());
var ninja = kernel.Get<Ninja>();
ninja.Strike();
}
}
答案 1 :(得分:4)
不会只是:
var ninja = Kernel.Get<Ninja>();
你显然必须通过Ninject解决依赖关系。
答案 2 :(得分:1)
您需要拥有StandardKernel
的实例,让我们将其称为kernel
,然后使用kernel.Get<Ninja>()
。这是有效的,因为忍者是非抽象的,所以它被认为是自己的约束。显然,一些具体类型需要绑定到IWeapon以允许NInject创建Ninja。