Удержание экземпляра класса в статическом объекте в C#

У нас есть класс "DataAccessServiceConnector", в котором у нас мало методов для связи со службой доступа к данным.

public class DataAccessServiceConnector: IDataAccessServiceConnector
{
     public async Task<HttpResponseMessage> GetDataAccessServiceResponse()
     {
        //Some code
        return GetDataFromDataAccessService();
     }        
}

У нас есть интерфейс:

public interface IDataAccessServiceConnector
{
    Task<HttpResponseMessage> GetDataAccessServiceResponse();
}

И имея другой класс, который содержит экземпляр класса "DataAccessServiceConnector" в качестве статического объекта.

public class ClassA
{
  public static IDataAccessServiceConnector DataAccessConnector;
  //Constructor of the Class
  ClassA()
  {
     DataAccessConnector = DataAccessConnector ?? new DataAccessServiceConnector();
  }
}

Это плохая практика для хранения экземпляра класса (например, DataAccessServiceConnector) в статическом объекте (например, DataAccessConnector)?

2 ответа

Опция 1.

Если уже есть объект верхнего уровня, такой как "Программа" или "Приложение", к которому у всех уже есть доступ, вы можете сделать объект экземпляра новым полем или свойством для него.

Вариант 2

Предоставьте статический доступ к объекту экземпляра из объекта экземпляра в виде статического метода / поля / свойства.

Или, как вы описали, предоставьте статический доступ к объекту экземпляра из другого произвольного типа, если это удобно для вашего проекта. Классовая иерархия, как вы описали, звучит для меня совершенно нормально.

Я думаю, что ответ на ваш вопрос основан на мнении в контексте Stackru.

Это классика "Является ли Singleton Pattern Bad?" вопрос:


В частности, существует множество проблем с Singletons и с памятью с общим доступом для записи в целом.

  • Как уже упоминалось выше, совместное использование ресурсов требует крайней осторожности;
  • Точно так же тестирование [юнитов] такого класса не просто;
  • (Меж) зависимости между классами менее обнаружимы;
  • Код сложнее следовать;
  • Ошибки труднее исправить;
  • Рефакторинг кода становится сложнее в определенных случаях;
  • ... этот список можно продолжать и продолжать.

Я лично решил использовать Singletons только в качестве крайней меры. Даже в этом случае я бы полагался на одноэлементную регистрацию среды внедрения зависимостей вместо static поле. (Например , регистрация Singletonjector синглтон.)

Но прежде чем регистрировать что-то как Singleton, пожалуйста, сначала пересмотрите использование обычных объектов.

Другие вопросы по тегам