C# 如何使用.NET MVC Ninject注入的Singleton类?

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

我对InSingletonScope()有一些问题

我的界面:

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;
    }
}