我对doco感到困惑,我应该如何设置Ninject。我看到了不同的做法,一些v2与v1的混淆可能包括......
问题 - 我的WinForms应用程序中为NInject设置的最佳方法是什么(即需要几行代码)。我假设这将进入MainForm Load方法。换句话说,在我到达之前我必须拥有什么代码:
Bind<IWeapon>().To<Sword>();
我有以下代码,所以实际上我只想澄清一下我的MainForm.Load()中需要的设置和绑定代码,最终得到一个具体的Samurai实例?
internal interface IWeapon
{
void Hit(string target);
}
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
class Samurai
{
private IWeapon _weapon;
[Inject]
public Samurai(IWeapon weapon)
{
_weapon = weapon;
}
public void Attack(string target)
{
_weapon.Hit(target);
}
}
感谢
PS。我尝试过以下代码,但是我无法解决“Bind”问题。这是从哪里来的?我会丢失什么DLL或“使用”语句?
private void MainForm_Load(object sender, EventArgs e)
{
Bind<IWeapon>().To<Sword>(); // <== *** CAN NOT RESOLVE Bind ***
IKernel kernel = new StandardKernel();
var samurai = kernel.Get<Samurai>();
答案 0 :(得分:2)
这里缺少的部分是你必须初始化内核并传入你定义的具有Bind的模块。
所以你需要一个类似这样的模块:
public class WeaponModule: NinjectModule
{
public override void Load()
{
Bind<IWeapon>().To<Sword>();
}
}
然后在你的表单中加载实例化内核,如下所示:
private void MainForm_Load(object sender, EventArgs e)
{
IKernel kernel = new StandardKernel(new WeaponModule());
var samurai = kernel.Get<Samurai>();
另外,如果您使用的是Ninject 2,则不需要在构造函数上使用[Inject]属性,Ninject会自行计算出来。