Объект, зависящий от другого объекта — когда загружать его свойства

#c# #sql-server #oop

#c# #sql-сервер #ооп

Вопрос:

Представьте себе класс employee:

 public class Employee
 {
   public int ID { get; set; }
   public string FirstName { get; set; }
   public Employee(int ID, string FirstName)
       {
         this.ID = ID;
         this.FirstName = FirstName;
       }
 }
  

Данные для сотрудника загружаются из уровня доступа к данным (DAL), который является другим отдельным классом.

Позже я решаю, что мне нужно другое свойство, а именно Отдел для сотрудника, однако отдел сам по себе является огромной категорией, поскольку имеет свои собственные свойства. Итак, я в конечном итоге создаю для него класс:

 class Department
 {
  public string DepartmentID { get; set;}
  public string CostCenter { get; set; }
  public bool hasManager { get; set; }
  //more code
  //constructor for department
 }
  

Поэтому я затем изменяю свой класс employee сверху, чтобы включить экземпляр отдела:

 public class Employee {
  //existing code for an employee above PLUS the below
  public Department d { get; set; }
}
  

Итак, теперь я в порядке, у меня есть класс employee с отделом, связанным с ним. Когда я вызываю свой класс DAL, чтобы получить данные для моего сотрудника, это может вернуть фактический отдел в SQL-запросе. Таким образом, я могу легко назначить DepartmentID отдел класса. Но когда / как я должен назначить все остальные свойства класса Department.

Кроме того, все свойства для CostCenter, hasManager и т. Д. Хранятся На уровне базы данных. Если я изначально получаю только идентификатор отдела, должен ли я снова вызвать класс DAL, чтобы получить всю необходимую информацию для отдела? Если да, то где я должен это назвать, я не думал, что вызов класса DAL из конструктора моего отдела был хорошей идеей. Я знаю, что мог бы просто создать связь между моими двумя таблицами и получить соответствующую информацию из отдела, а затем я могу создать экземпляр своего отдела в конструкторе employee. Но у класса employee МНОГО свойств, и уже много полей возвращается из базы данных, поэтому, если я сделаю это, мой конструктор может становиться все больше и больше….

Ответ №1:

Что ж, у вас есть выбор…

Я предполагаю, что у вас есть свой собственный DAL, потому что EF и Linq2SQL имеют встроенные опции для этого.

  1. Нетерпеливая загрузка — загрузка отдела с человеком.
  2. Загрузка по требованию: if (p.d == null) ...
  3. Отложенная загрузка: выполняйте по требованию внутри средства получения d свойства.

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

1. Я думаю, я понимаю, что вы имеете в виду, я изучу это еще немного.