【问题标题】:How to use Singleton class injected by .NET MVC Ninject?如何使用 .NET MVC Ninject 注入的 Singleton 类?
【发布时间】:2015-06-30 08:44:06
【问题描述】:

我对 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));
        }
}

绑定看起来像这样:

kernel.Bind<ISettingsManager>().To<SettingsManager>().InSingletonScope();

您如何看待这种方法?

例如,在 HomeControler 中,当我添加时:

[Inject]
SettingsManager _settingsManager;

_settingsManager 始终为空。

如何在另一个项目中使用 SettingsManager 单例?我总是得到空值。

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection


    【解决方案1】:

    您如何看待这种方法?

    InSingletonScope() - 只会创建该类型的单个实例,并且为每个后续请求返回相同的实例。依赖项将具有与内核相同的范围,即在内核被释放时被释放。

    了解对象范围here

    [Inject]
    SettingsManager _settingsManager;
    

    你想在这里做什么?现场注入?

    我认为它不受支持。从官方页面复制以下内容:

    Field Injection 是一种不好的做法,为了最小化而被削减为 v1 和 v2 之间重写的一部分。没有现场注入 忍者 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;
        }
    }
    

    【讨论】:

    • 我知道它是如何工作的,但我想问一下我的实现是否与此一致。我想进行属性注入(未归档),但我总是得到空值。
    • @user3146344 - 与此一致吗?请检查我的答案和提供的链接,希望它会有所帮助。
    • 我尝试了属性注入,但仍然得到:尝试创建类型为“Web.Controllers.HomeController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。
    • 这意味着您没有正确设置依赖代码。如果您调试断点是否命中绑定调用?
    • 是的。在调试中,我可以看到调用命中: kernel.Bind().To().InSingletonScope();
    【解决方案2】:

    您需要将 _settingsManager 更改为 ISettingsManager 类型而不是 SettingsManager。

    (你将 ISettingsManager 绑定到 SettingsManager。这意味着当 Ninject 看到对 ISettingsManager 的依赖时,它会注入一个 SettingsManager。如果某些东西直接声明为 SettingsManager,它不会做任何事情)

    【讨论】:

    • 另外,正如另一个答案所说,您不能直接注入字段。我建议改为使用构造函数注入。
    • 我添加了构造函数注入是 HomeController 并且我有: public HomeController(IProductService context, ISettingsManager settingsManager) ,但我收到错误:尝试创建类型为“Web.Controllers.HomeController”的控制器时发生错误'。确保控制器有一个无参数的公共构造函数。我想在我的应用程序中多次使用我的 Singleton。这就是为什么我必须在每个类中进行构造函数注入?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多