【问题标题】:Constructor Inject with Ninject 2Ninject 2 的构造函数注入
【发布时间】:2023-03-07 06:39:01
【问题描述】:

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

}

我将如何更改代码以使其正常工作?

【问题讨论】:

    标签: c# dependency-injection ninject


    【解决方案1】:
    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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      不就是这样吗:

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

      您显然必须通过 Ninject 解决依赖关系。

      【讨论】:

      • 当前内核是否有全局变量?
      • @Adam Tegen:谢天谢地没有。搜索 Service Locator 反模式并阅读 @Mark Seemann 的最高投票答案以了解原因。 (一些 Ninject 扩展确实有一个 KernelContainer 对象,但这只是根据需要,绝对不是核心功能)
      • 对于 ASP.NET,您可能是对的。对于 MVVM,我想我需要和 Mark 谈谈。此外,性能有时也可以证明使用反模式是合理的。
      • 另外,我想你的意思是这篇文章:blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
      【解决方案3】:

      您需要有一个StandardKernel 的实例,我们称之为kernel,然后使用kernel.Get&lt;Ninja&gt;()。这是有效的,因为 Ninja 是非抽象的,所以它被认为是绑定到自身的。显然一些具体的类型需要绑定到 IWeapon 才能让 NInject 创建 Ninja。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2017-02-23
        相关资源
        最近更新 更多