C# Ninject字段注入在具有构造函数的类中不起作用

C# Ninject字段注入在具有构造函数的类中不起作用,c#,asp.net-mvc,inversion-of-control,ninject,C#,Asp.net Mvc,Inversion Of Control,Ninject,在C#MVC项目中,我将Ninject用于IoC模式,当我使用构造函数注入时,它可以正常工作,没有任何问题,但当我将其用作字段注入时,#U orderNotification发生空引用异常 public class ShopManager { [Inject] private IOrderNotification _orderNotification; public ShopManager(string shopName) { //Do some

在C#MVC项目中,我将Ninject用于IoC模式,当我使用构造函数注入时,它可以正常工作,没有任何问题,但当我将其用作字段注入时,#U orderNotification发生空引用异常

public class ShopManager
{
    [Inject]
    private IOrderNotification _orderNotification;

    public ShopManager(string shopName)
    {
        //Do somethings
    }

    public int GetNotifyCount()
    {
        return _orderNotification.Count();
    }
}
我还在NinjectWebCommon注册了服务

kernel.Bind<IOrderNotification>().To<OrderNotification>();
kernel.Bind().To();

Ninject版本是3.0

如果您使用
Ninject 2
或更高版本,则无法将其注入字段。有关更多信息,请参阅本文。

如果您使用的是
Ninject 2
或更高版本,则无法注入到字段。有关更多信息,请参阅本文。

尝试以下方法:

  public IOrderNotification _orderNotification;

  public IOrderNotification OrderNotification
        {
            get
            {
                return _orderNotification ??
                       (_orderNotification = DependencyResolver.Current.GetService<IOrderNotification>());
            }
            set { _orderNotification = value; }
        }
试试这个:

  public IOrderNotification _orderNotification;

  public IOrderNotification OrderNotification
        {
            get
            {
                return _orderNotification ??
                       (_orderNotification = DependencyResolver.Current.GetService<IOrderNotification>());
            }
            set { _orderNotification = value; }
        }

已删除字段注入,但可以使用属性注入:

public class ShopManager
{
    [Inject]
    public IOrderNotification OrderNotification { get; set; }

    public ShopManager(string shopName)
    {
        //Do somethings
    }

    public int GetNotifyCount()
    {
        return OrderNotification.Count();
    }
}
然而,推荐的方法是使用构造函数注入。当您无法控制类的实例化时,或者当您有继承时,您需要向下传递ctor参数(但请记住,优先于继承!),这是属性注入的一个半合理的参数。 对我来说,您的示例似乎足够简单,可以使用构造函数注入。你为什么不呢? (当然,我不熟悉asp.net mvc,所以这个问题可能看起来很愚蠢)

编辑: 我验证了如上所示的属性注入在ninject 3.2.2中起作用。这意味着我已经测试过了;-)
另请参阅以获取有关注入类型和使用时间的更多信息。

字段注入已删除,但您可以使用属性注入:

public class ShopManager
{
    [Inject]
    public IOrderNotification OrderNotification { get; set; }

    public ShopManager(string shopName)
    {
        //Do somethings
    }

    public int GetNotifyCount()
    {
        return OrderNotification.Count();
    }
}
然而,推荐的方法是使用构造函数注入。当您无法控制类的实例化时,或者当您有继承时,您需要向下传递ctor参数(但请记住,优先于继承!),这是属性注入的一个半合理的参数。 对我来说,您的示例似乎足够简单,可以使用构造函数注入。你为什么不呢? (当然,我不熟悉asp.net mvc,所以这个问题可能看起来很愚蠢)

编辑: 我验证了如上所示的属性注入在ninject 3.2.2中起作用。这意味着我已经测试过了;-)
另请参阅,以了解有关注射类型和使用时间的更多信息。

Show
Ninject
version.@HamletHakobyan 3.0版。Show
Ninject
version.@HamletHakobyan 3.0版。虽然这样做有效,但这是一个糟糕的设计。现在您基本上使用的是服务定位器,但您不需要这样做。虽然这样做有效,但这是一个糟糕的设计。现在您基本上使用的是服务定位器,但不需要。您是对的,他应该使用属性注入。您是对的,他应该使用属性注入。谢谢您的回答,但DependencyResolver更有用。问题不是傻伙计!我在项目完成并发布后启动了IoC,所以我们应该做一些错误的事情,比如下面的sprint版本(敏捷很糟糕,我讨厌它。)@HadiSharifi我已经用Ninject 3.2.2对它进行了双重检查,它确实有效。请注意,这不是字段注入。谢谢您的回答,但DependencyResolver更有用。问题不是傻伙计!我在项目完成并发布后启动了IoC,所以我们应该做一些错误的事情,比如下面的sprint版本(敏捷很糟糕,我讨厌它。)@HadiSharifi我已经用Ninject 3.2.2对它进行了双重检查,它确实有效。注意,这不是字段注入。