C# 如何使用.NET MVC Ninject注入的Singleton类?
我对InSingletonScope()有一些问题 我的界面:C# 如何使用.NET MVC Ninject注入的Singleton类?,c#,asp.net-mvc,dependency-injection,C#,Asp.net Mvc,Dependency Injection,我对InSingletonScope()有一些问题 我的界面: public interface ISettingsManager { ApplicationSettings Application { get; } } 我的班级: public class SettingsManager : ISettingsManager { private readonly IConfigurationService _configurationS
public interface ISettingsManager
{
ApplicationSettings Application { get; }
}
我的班级:
public class SettingsManager : ISettingsManager
{
private readonly IConfigurationService _configurationService;
private readonly Lazy<ApplicationSettings> _applicationSettings;
public ApplicationSettings Application { get { return _applicationSettings.Value; } }
private SettingsManager(IConfigurationService context)
{
_configurationService = context;
_applicationSettings = new Lazy<ApplicationSettings>(() => new ApplicationSettings(context));
}
}
\u设置管理器
始终为空
如何在另一个项目中使用SettingsManager单例?我总是得到空值
你认为这种方法怎么样
InSingletonScope()-将仅创建该类型的单个实例,并且将为每个后续请求返回相同的实例。依赖项的作用域与内核的作用域相同,即在内核被释放时被释放
阅读有关对象范围的内容
你想在这里干什么?现场注射
我认为这是不受支持的。从官方页面复制以下内容:
现场注入是一种不好的做法,并被切割为最小化
在v1和v2之间重写的一部分。没有现场注入
Ninject v2
您可以改为使用属性或构造函数注入
属性注入:
[Inject]
public ISettingsManager SettingsManager { private get; set; }
public class HomeController : Controller
{
readonly ISettingsManager settingsManager;
public HomeController(ISettingsManager settingsManager )
{
if(settingsManager == null)
throw new ArgumentNullException("settingsManager is null");
this.settingsManager = settingsManager;
}
}
构造函数注入:
[Inject]
public ISettingsManager SettingsManager { private get; set; }
public class HomeController : Controller
{
readonly ISettingsManager settingsManager;
public HomeController(ISettingsManager settingsManager )
{
if(settingsManager == null)
throw new ArgumentNullException("settingsManager is null");
this.settingsManager = settingsManager;
}
}
您需要将_settingsManager更改为ISettingsManager类型,而不是settingsManager
(您正在将ISettingsManager绑定到SettingsManager。这意味着当Ninject看到对ISettingsManager的依赖时,它将注入一个SettingsManager。如果直接声明为SettingsManager,它将不会做任何事)另外,正如另一个答案所说,您不能直接注入到字段。我建议改为构造函数注入。我添加了构造函数注入为HomeController,我有:public HomeController(IPProductService上下文,ISettingsManager设置sManager),但我得到错误:尝试创建“Web.Controllers.HomeController”类型的控制器时出错。确保控制器具有无参数公共构造函数。我想在我的应用程序中多次使用我的Singleton。这就是为什么我必须在每个类中进行构造函数注入?我知道它是如何工作的,但我想问一下我的实现是否与此一致。我想进行属性注入(不归档),但我总是得到null。@user3146344-与此一致吗?请检查我的答案和提供的链接,希望能有所帮助。我尝试了属性注入,但仍然得到:尝试创建“Web.Controllers.HomeController”类型的控制器时出错。确保控制器具有无参数公共构造函数。这意味着您没有正确设置依赖项代码。如果调试断点是否命中绑定调用?是。在调试中,我可以看到调用命中了:kernel.Bind().To().InSingletonScope();
public class HomeController : Controller
{
readonly ISettingsManager settingsManager;
public HomeController(ISettingsManager settingsManager )
{
if(settingsManager == null)
throw new ArgumentNullException("settingsManager is null");
this.settingsManager = settingsManager;
}
}