Как правильно использовать статическую переменную в ООП?

#c# #oop

#c# #ооп

Вопрос:

Я работаю над системой управления сотрудниками. Каждый сотрудник принадлежит к одному отделу, когда сотрудник входит в систему, я сохраняю userId и DepartmentID в своем классе, как показано ниже

 internal static class MyStaticData
{
    internal static Guid UserId { get; set; }
    internal static Guid DepartmentId { get; set; }
}
  

Когда пользователь переходит на страницу create leave application и нажимает кнопку save, мне нужно отправить как userId, так и DepartmentID для сохранения в базе данных, так каков правильный способ отправки userId и DepartmentID на эту страницу между

 // Create instance property inside the class and assign it when create new object.
public class LeavePage
{
    public Guid UserId { get; set; }
    public Guid DepartmentId { get; set; }
}

var leavePage = new LeavePage { UserId = MyStaticData.UserId, DepartmentId = MyStaticData.DepartmentId };
  

или

 // Don't have instance property inside the class but use MyStaticData directly
public class LeavePage
{
    public void Save()
    {
        Db.Save(data, ..., MySataicData.UserId, MyStaticData.DepartmentId);
    }
}
  

Я не уверен, какой из них лучше (меньше сцепления) или у него есть лучший способ сделать это?

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

1. Вы говорите о «покинуть страницу». Вы разрабатываете веб-приложение? Тогда статические пользовательские данные — плохая идея.

2. Вы путаете членов класса статических объектов с постоянными членами экземпляра? Статические члены являются общими для всех экземпляров вашего класса. Вероятно, вы захотите использовать закрытую константу для идентификаторов пользователя и отдела, поскольку они являются переменными для разных пользователей.

3. @DanielB: Это оконное приложение.

4. @DanielB: Почему статические пользовательские данные — плохая идея?

5. @Akram Shahda: В веб-приложении (asp.net ) статические переменные являются общими для всего приложения и не имеют области действия запроса, поэтому каждый пользователь переопределит статическую переменную для других со своими собственными данными.

Ответ №1:

Возможно, вы захотите попробовать использовать статический экземпляр какого-нибудь более общего класса — что-то вроде этого:

 public class User
{
    public Guid Id { get; set; }
    public Guid DepartmentId { get; set; }
}

public static class SessionContext
{
    public static User CurrentUser { get; set; }
}
  

Затем используйте SessionContext.CurrentUser при сохранении.

Конечно, в этом случае использование статического класса, вероятно, неуместно, и вам следует обратиться к экземпляру, зависящему от сеанса.

Ответ №2:

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