Как настроить Ninject для ввода NodaTime IClock

В моем NinjectConfigurator у меня есть

container.Bind<IClock>().To<SystemClock>(); 

Я тоже пробовал

container.Bind<IClock>().To<SystemClock>().InSingletonScope();

Но я получаю такую ​​ошибку:

Ошибка активации IClock с использованием привязки от IClock к SystemClock. Для создания экземпляра этого типа реализации не было доступного конструктора.

Путь активации: 3) Внедрение зависимости IClock в часы параметров конструктора типа SystemManager 2) Внедрение зависимости ISystemManager в параметр systemManager конструктора типа AccountController 1) Запрос на AccountController

Предложения: 1) Убедитесь, что у типа реализации есть общедоступный конструктор. 2) Если вы реализовали шаблон Singleton, используйте вместо этого привязку с InSingletonScope ().

Это мой класс с инъекцией, как и все другие рабочие классы с IoC в моем проекте:

private readonly IDateTime _dateTime;
private readonly IClock _clock;

public SystemManager(IDateTime dateTime, IClock clock)
{
    this._dateTime = dateTime;
    this._clock = clock;
}

Я не мог найти ничего, что могло бы мне помочь в этом. Любая помощь очень ценится.


person Brad Jeffery    schedule 11.11.2015    source источник


Ответы (1)


Я некоторое время сам не использовал NInject, но считаю, что вы хотите использовать ToConstant() для привязки к экземпляру SystemClock:

container.Bind<IClock>().ToConstant(SystemClock.Instance);
person Jon Skeet    schedule 11.11.2015
comment
ты легенда. Большое спасибо! - person Brad Jeffery; 12.11.2015
comment
Можете ли вы объяснить, почему вы думаете, что ninject предназначен для обработки одноэлементных классов таким образом? Вы ожидали, что он будет использовать отражение для поиска статического члена Instance? Вероятно, это из-за следующей строки в сообщении об исключении, верно?: 2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. Я думаю, что сообщение вводит в заблуждение, вероятно, оно связано с контекстными функциями, что может означать, что при некоторых обстоятельствах контекстная информация доступна для создания экземпляра, а при других обстоятельствах это не. - person BatteryBackupUnit; 13.11.2015
comment
@BatteryBackupUnit: Это привело меня к следующей документации: github.com/ninject/ninject / wiki / Object-Scopes - это дает пример одноэлементного класса, а затем, кажется, обеспечивает привязку с использованием InSingletonScope. Теперь возможно, что он действительно пытался дать это как альтернативу реализации одноэлементного шаблона, но если это так, это действительно непонятная документация :( - person Jon Skeet; 13.11.2015
comment
согласен, непонятно. Он должен отображать не только код до, но и после. То же, что и раньше, но без public static readonly Shogun Instance = new Shogun();. Это означает, что для этого по-прежнему требуется общедоступный ctor (который отсутствует в SystemClock и приводит к исключению автора вопроса - ваше решение является подходящим для его исправления). - person BatteryBackupUnit; 13.11.2015
comment
@BatteryBackupUnit: Righto - удалит последнюю часть ответа. - person Jon Skeet; 13.11.2015
comment
а для тех, кто наткнулся на эти вопросы и ответы, но ищет ответ на внедрение зависимостей Microsoft (ServiceProvider, ServiceCollection ...), вы можете использовать аналогичный код: services.AddSingleton<IClock>(SystemClock.Instance); - person Pac0; 28.09.2018
comment
И если вы используете Autofac, вы можете использовать: builder.Register(_ => SystemClock.Instance).As<IClock>().SingleInstance();builder как ContainerBuilder) - person Pac0; 09.11.2018