2011-05-02 104 views
1

我已经使用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(); 
    } 

} 

我将如何改变代码,得到它的工作?

回答

4

岂不只是:

var ninja = Kernel.Get<Ninja>(); 

显然,你必须解决,虽然Ninject的依赖。

+0

当前内核是否有全局? – 2011-05-02 22:24:49

+0

@Adam Tegen:谢天谢地没有。搜索服务定位器反模式并阅读@Mark Seemann的最高票数答案。 (有些Ninject扩展确实有一个KernelContainer对象,但这只是在需要的基础上,绝对不是核心功能) – 2011-05-03 23:58:28

+0

对于ASP.NET,您可能是对的。对于MVVM,我想我需要和Mark谈一谈。此外,性能有时也可以证明使用反模式。 – 2011-05-04 02:12:08

1

您需要有一个StandardKernel的实例,我们将其称为kernel,然后使用kernel.Get<Ninja>()。由于忍者不是抽象的,所以它是有效的,所以它被认为是绑定到它自己的。显然有些具体类型需要绑定到IWeapon才能让NInject创建忍者。

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(); 
    } 
}