构造函数注入Ninject 2
问题描述:
我已经使用Ninject和MVC3为构造函数参数的automagic注入。它效果很好。构造函数注入Ninject 2
你如何做与非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();
}
}
我将如何改变代码,得到它的工作?
答
岂不只是:
var ninja = Kernel.Get<Ninja>();
显然,你必须解决,虽然Ninject的依赖。
答
您需要有一个StandardKernel
的实例,我们将其称为kernel
,然后使用kernel.Get<Ninja>()
。由于忍者不是抽象的,所以它是有效的,所以它被认为是绑定到它自己的。显然有些具体类型需要绑定到IWeapon才能让NInject创建忍者。
答
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();
}
}
当前内核是否有全局? – 2011-05-02 22:24:49
@Adam Tegen:谢天谢地没有。搜索服务定位器反模式并阅读@Mark Seemann的最高票数答案。 (有些Ninject扩展确实有一个KernelContainer对象,但这只是在需要的基础上,绝对不是核心功能) – 2011-05-03 23:58:28
对于ASP.NET,您可能是对的。对于MVVM,我想我需要和Mark谈一谈。此外,性能有时也可以证明使用反模式。 – 2011-05-04 02:12:08