Несоответствие экземпляра Singleton между внедрением зависимостей и статическим аксессоромC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Несоответствие экземпляра Singleton между внедрением зависимостей и статическим аксессором

Сообщение Anonymous »

Я пытаюсь создать объект Singleton LoggerHelper и получить тот же экземпляр с помощью внедрения зависимостей и статического LoggerHelperAccessor. Однако я столкнулся с проблемой, из-за которой эти два подхода не возвращают один и тот же экземпляр, о чем свидетельствуют различия в свойстве LogId.
Я добавил LogId в LoggerHelper, чтобы проверить, извлекается ли один и тот же экземпляр обоими методами.
Вот моя настройка:
< Strong>Класс LoggerHelper:

Код: Выделить всё

public class LoggerHelper : ISingletonLoggerHelper
{
public string LogId { get; set; }
}
Интерфейс:

Код: Выделить всё

public interface ISingletonLoggerHelper
{
string LogId { get; set; }
}
Startup.cs:
Я регистрирую LoggerHelper как синглтон и присваиваю значение LogId (используя статический метод доступа), чтобы использовать его для будущей проверки
Startup.cs:
Я регистрирую LoggerHelper как синглтон и присваиваю значение LogId (с помощью статического метода доступа) для использования в будущем
Startup.cs:
p>

Код: Выделить всё

services.AddSingleton();
services.AddScoped();

using (var serviceProvider = services.BuildServiceProvider())
{
LoggerHelperAccessor.loggerHelper = (LoggerHelper)serviceProvider.GetRequiredService();
LoggerHelperAccessor.loggerHelper.LogId = "55";
}
Статический метод доступа:
Этот класс статического метода доступа используется для доступа к экземпляру LoggerHelper, не более того.

Код: Выделить всё

public static class LoggerHelperAccessor
{
public static LoggerHelper loggerHelper { get; set; }
}
LoggingService.cs:
В LoggingService я внедряю LoggerHelper через внедрение зависимостей, а также получаю к нему доступ через статический LoggerHelperAccessor. Однако _loggerHelper и _loggerHelper2 не являются одним и тем же экземпляром, поскольку _loggerHelper.LogId имеет значение null, а _loggerHelper2.LogId имеет значение 55 :

Код: Выделить всё

public class LoggingService
{
private readonly LoggerHelper _loggerHelper;
private readonly LoggerHelper _loggerHelper2;

public LoggingService(ISingletonLoggerHelper loggerHelper)
{
_loggerHelper = (LoggerHelper)loggerHelper; // LogId = null
_loggerHelper2 = (LoggerHelper)LoggerHelperAccessor.loggerHelper; // LogId = "55"
}
}
Проблема в том, что _loggerHelper (внедренный с помощью внедрения зависимостей) не сохраняет значение LogId, установленное в Startup.cs, и показывает значение null
code> вместо этого, в то время как _loggerHelper2 (доступ к которому осуществляется через статический метод доступа) имеет LogId, установленный на «55». Кроме того, изменение _loggerHelper2 не влияет на _loggerHelper и наоборот, что указывает на то, что они могут быть отдельными экземплярами.
Мой вопрос:< /p>
Почему экземпляр LoggerHelper, внедренный с помощью внедрения зависимостей, не совпадает с экземпляром, полученным с помощью статического LoggerHelperAccessor, несмотря на то, что он настроен в Startup.cs? Что может быть причиной такого несоответствия в моем коде?

Подробнее здесь: https://stackoverflow.com/questions/791 ... c-accessor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»