我在使用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单例?我总是无效。
答案 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,它将不会执行任何操作)