Что не так с классами в ASP.Net Core?

Создал я пару отдельных классов (находятся в двух отдельных проектах) для управления устройством через веб (задача такая) и объявил в классе Startup (третий проект):
Device device = new Device();
        Control control = new Control();

Создал. Всё как обычно. Но почему-то при запуске программы устройство почему-то на полсекунды включается и выключается. GPIO сбрасывается в ноль. В просто консольном приложении устройство нормально включается и выключается только по запросу. Решил проверить один статус устройства, чтобы найти виновника проблемы. Оказалось, что любая попытка присвоить ему заканчивается неудачей. Как-будто классы сбрасываются каждый раз. Классы инициализируются только один раз, при создании Startup. Но переменные, находящиеся в Startup спокойно хранят значения.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 2
serafimprozorov
@serafimprozorov
Люблю Erlang....
Если Вы хотите, чтобы экземпляры Ваших классов создавались при старте приложения и оставались доступными всё время его работы, Вам надо либо сделать их статическими полями какого-либо класса, либо использовать паттерн Синглтон (ни разу не антипаттерн при правильном использовании), либо, как Вам говорили выше,использовать Dependency Injection, почитать про него можно, например, здесь: https://docs.microsoft.com/ru-ru/aspnet/core/funda...

Почему, вообще, происходит то, что Вы описали. Класс Startup создается при старте приложения и используется только для его конфигурации, то есть, он не живёт всё время работы Вашего приложения, а следовательно, все объекты, являющиеся его полями, уничтожаются сборщиком мусора, если не передать владение ими другому объекту, имеющему большее время жизни. Вы же, как я понял, просто создаете эти объекты в методе, в этом случае, опять же, если не передать владение, они станут недоступными сразу после завершения метода и весьма быстро соберутся сборщиком мусора.
Ответ написан
Комментировать
@yuopi
C# developer
В asp.net core так классы не стоит создавать, нужно юзать Dependency Enjection.
В файле Startup метод ConfigureServices
добавляем:
services.AddSingleton();
services.AddSingleton();

А в классах, в которых их нужно использовать - получать их через конструктор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы