Используйте IOC в одноэлементном шаблоне в ASP.NET Сердечник

#c# #asp.net-core #singleton #inversion-of-control

Вопрос:

Ошибка:

Лениво инициализированный тип не имеет открытого конструктора без параметров

Код:

 public sealed class LogDataService
{
    private static readonly Lazy<LogDataService> logDataService = new Lazy<LogDataService>();
    private readonly ILogDataRepository _logDataRepository;

    

    private LogDataService(ILogDataRepository logDataRepository)
    {
        _logDataRepository = logDataRepository;
    }

    public static LogDataService Instance
    {
        get
        {
            return logDataService.Value;
        }
    }

    public  void SaveLogData(Exception exception)
    {
       // myCode
    }
}
 

Комментарии:

1. Почему бы вам просто не ввести LogDataService как синглтон в DI? Здесь есть что-то очень странное. Вы смешиваете статику и ДИ, которые обычно не идут хорошо

Ответ №1:

Error: The lazily-initialized type does not have a public, parameterless constructor

Ошибка достаточно очевидна. Вам нужен общедоступный конструктор без параметров, чтобы заставить его работать. что-то вроде

 public LogDataService(){}
 

Уже упоминалось в документе.

Комментарии:

1. Я хочу использовать _logDataRepository в своем методе SaveLogData, но _logDataRepository имеет значение null, если я использую конструктор без параметров!

2. Тогда это нельзя было сделать с ленивой загрузкой… вместо этого используйте обычный метод, чувак