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

时间:2014-04-06 10:17:43

标签: c# asp.net-mvc inversion-of-control ninject

在C#MVC项目中,我使用Ninject作为IoC模式,当我使用构造函数注入时它工作正常没有任何问题但是当我将它用作字段注入时,_orderNotification发生了NULL引用异常。

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

Ninject版本为3.0

3 个答案:

答案 0 :(得分:4)

试试这个:

  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 int GetNotifyCount()
    {
        return OrderNotification.Count();
    }
}

答案 1 :(得分:3)

如果使用Ninject 2或更高版本,则无法注入字段。有关详细信息,请参阅Things that were in Ninject 1.x that are not in Ninject 2文章。

答案 2 :(得分:0)

现场注入已被移除,但有可以使用的属性注入:

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一起使用。这意味着我已经测试过了;-) 另请参阅https://github.com/ninject/ninject/wiki/Injection-Patterns了解更多关于注射剂种类和使用时间的信息。