Проблема в том, что эти свойства (поля, на самом деле) находятся в синглтоне:
public string userName;
public string firstName;
public string personID;
public string secBlur;
public int admin;
public int fafsa;
public int staff;
... наряду с тем, что они заполняются в конструкторе. Это означает, что при первом создании класса он заполняется. Если вы повторно используете тот же экземпляр класса в качестве одиночного, конструктор никогда не будет вызываться снова, что означает, что заполненные значения будут установлены один раз и останутся навсегда.
Другими словами, ваши пользовательские данные являются одноэлементными. Если у вас не будет только одного пользователя, это не хорошо.
Во-первых, я бы отделил класс, который получает данные, от класса, который содержит данные.
Данные могут выглядеть так:
public class UserData
{
public string UserName { get; set; }
public string FirstName { get; set; }
// ..etc...
}
Эта модель содержит данные. Он не содержит код для заполнения данных.
Затем создайте класс, который извлекает данные. Он не должен извлекать данные в конструкторе. Конструктор предназначен для создания класса. Это не то место, куда мы поместили бы то, что на самом деле делает класс.
У этого класса может быть такой метод:
public UserData GetUserData()
... который создаст экземпляр UserData
и вернет его.
Для чего бы это ни стоило, для большинства сценариев нам не нужно создавать синглтон.
Предположим, у вас есть этот класс:
public class SqlUserDataProvider
{
UserData GetUserData()
{
...
}
}
Если конструктор не делает ничего «тяжелого», например, чтения данных или файлов, вы можете просто создавать новый экземпляр каждый раз, когда он вам нужен. Это менее эффективно, чем использование одного экземпляра, но разница обычно настолько незначительна, что не стоит об этом думать.
Или вы можете создать один экземпляр и использовать его повторно. В этом случае вы используете его как синглтон, но технически это не так. Синглтон - это класс, написанный так, что можно создать только один его экземпляр. В большинстве случаев просто нет причин делать это. Это дополнительные строки кода, чтобы строго наложить ограничения на то, как мы используем класс. Это может потенциально сделать код менее обслуживаемым и сложным для отладки. Так что это лишняя работа, ни для выгоды, ни для негативной выгоды.