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

时间:2015-06-30 08:44:06

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

我在使用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单例?我总是无效。

2 个答案:

答案 0 :(得分:0)

  

您如何看待这种方法?

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

了解对象范围here

[Inject]
SettingsManager _settingsManager;

你想在这做什么?现场注射?

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

  

现场注射是一种不好的做法,并且因为最小化而被削减   v1和v2之间重写的一部分。没有现场注入   Ninject v2。

您可以使用Property或Constructor注入。

物业注入:

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

答案 1 :(得分:0)

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

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