Конечно, это сломается, если вы сделаете конструктор приватным. Вы не можете вызывать частных конструкторов за пределами вашего класса!
То, что вы делаете, это именно то, что вы должны делать. Проверьте это:
var reader1 = ninject.Get<IInputReader>();
var reader2 = ninject.Get<IInputReader>();
Assert.AreSame(reader1, reader2);
Вам не нужно статическое поле, чтобы получить экземпляр синглтона. Если вы используете контейнер IoC, вы должны получить все свои экземпляры через контейнер.
Если вы делаете хотите открытое статическое поле (не уверены, есть ли для этого веские причины), вы можете привязать тип к его значению, например:
Bind<UserInputReader>().ToConstant(UserInputReader.Instance);
РЕДАКТИРОВАТЬ : Чтобы указать IDictionary<ActionInputType, Keys>
для использования в конструкторе UserInputReader
, вы можете использовать метод WithConstructorArgument
:
Bind<UserInputReader>().ToSelf()
.WithConstructorArgument("keyMapping", Constants.DEFAULT_KEY_MAPPING)
.InSingletonScope();