C# Ninject字段注入在具有构造函数的类中不起作用
在C#MVC项目中,我将Ninject用于IoC模式,当我使用构造函数注入时,它可以正常工作,没有任何问题,但当我将其用作字段注入时,#U orderNotification发生空引用异常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
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版。ShowNinject
version.@HamletHakobyan 3.0版。虽然这样做有效,但这是一个糟糕的设计。现在您基本上使用的是服务定位器,但您不需要这样做。虽然这样做有效,但这是一个糟糕的设计。现在您基本上使用的是服务定位器,但不需要。您是对的,他应该使用属性注入。您是对的,他应该使用属性注入。谢谢您的回答,但DependencyResolver更有用。问题不是傻伙计!我在项目完成并发布后启动了IoC,所以我们应该做一些错误的事情,比如下面的sprint版本(敏捷很糟糕,我讨厌它。)@HadiSharifi我已经用Ninject 3.2.2对它进行了双重检查,它确实有效。请注意,这不是字段注入。谢谢您的回答,但DependencyResolver更有用。问题不是傻伙计!我在项目完成并发布后启动了IoC,所以我们应该做一些错误的事情,比如下面的sprint版本(敏捷很糟糕,我讨厌它。)@HadiSharifi我已经用Ninject 3.2.2对它进行了双重检查,它确实有效。注意,这不是字段注入。