Я не хочу, чтобы мой объект знал о моем бизнес-уровне - как его загрузить? - PullRequest
1 голос
/ 13 октября 2011

Я разместил это:

Объект зависит от другого объекта - когда загружать его свойства

После прочтения этого и изучения некоторых других я пришел к выводу, чтоЛенивая загрузка была бы идеальной для моей ситуации.Тем не менее, некоторая справочная информация.Класс, который я разместил Department, получает данные о своих свойствах из базы данных (Sql Server 2k5).Это типичная установка:

Front End->BOL->DAL

Поэтому я хотел, чтобы мой класс Department в основном просто содержал информацию, относящуюся к нему.Я не хотел / не хочу выставлять свой класс бизнес-объектов этому классу.Итак, как бы я заполнил свой объект отдела без необходимости вызова уровня моего бизнес-объекта.

Я думаю, что код поможет:

public class Employee 
 { 
   public int ID { get; set; } 
   public string FirstName { get; set; } 
   public Department d { get; set; }  //todo: implement lazy load in get.
   public Employee(int ID, string FirstName) 
       { 
         this.ID = ID; 
         this.FirstName = FirstName; 
       } 
 } 


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

А затем произнесите, что мой BOL используется для вызовамой DAL должен сделать что-то вроде:

//some bol class that simply calls the data access layer class
DAL.GetDepartments("SomeDepartment");

И DAL делает некоторый код, чтобы вернуть некоторые данные для заполнения объекта отдела ...

Однако, если я лениво загружаю свое свойство getтогда для отдела нужно было бы знать о моем BOL, поэтому мне нужно было бы добавить оператор using, чтобы включить и этот класс.Это не может быть правильным способом сделать это ... Любые советы или указатели?

Ответы [ 3 ]

1 голос
/ 13 октября 2011

В моем текущем проекте почти все мои бизнес-объекты домена имеют как минимум два конструктора. (1) принимает идентификатор для этого объекта, чтобы он мог самостоятельно создавать, извлекая данные из самой базы данных.Другой конструктор (2) принимает объект данных, необходимый для функционирования этого объекта домена.Таким образом, я могу загружать или лениво, в зависимости от того, что лучше в данный момент.

Итак, если кто-то вызывает свойство Department вашего бизнес-объекта Employee, свойство может проверить, было ли оно уже.Если нет, вы можете получить DepartmentID из данных сотрудника, создать экземпляр отдела и (сохранить, если и) вернуть его.Таким образом, легко получить любые доменные объекты, которые вам нужны.

Но вы все равно хотите иметь возможность быстрой загрузки.Допустим, у вас есть бизнес-объект Department со свойством Employees, которое возвращает List(Of Employee).Свойство Employees будет напрямую получать данные из базы данных и создавать экземпляры каждого Employee с помощью конструктора data .Таким образом, у вас будут свои классные бизнес-объекты Employee, 80 из них, но с одним запросом данных.

А затем, чтобы поднять его на ступеньку выше, ваши объекты могут принимать многослойные данные.Например, вы можете создать Employee с сущностью Employee из DAL, которая также включает данные для отдела, супервизора и т. Д. Конструктор «ID» также может получить эти данные с самого начала.

В конце концов, вам придется принять решение о том, что предварительно загружать и что лениво загружать.Например, возможно, в 90% случаев, когда вы создаете сотрудника, вам также нужны данные отдела.Тогда вы можете просто получить данные Отдела, когда создаете сотрудника с помощью конструктора EmployeeID.Но, скажем, данные супервизора используются только в 8% случаев.Вы могли бы решить всегда лениво загружать это.

1 голос
/ 13 октября 2011

Если вы действительно хотите выполнять отложенную загрузку компонентов, взгляните на некоторые ORM, такие как NHibernate, EF4 и т. Д.

Создать собственное решение для отложенной загрузки - это не тривиальная задача, а сложная задача.такие понятия, как динамическое проксирование, может быть, генерация IL и другие сложные темы.

В любом случае, касательно вашего вопроса о зависимостях и использования или не использования вашего BOL из вашего DAL, проверьте, можете ли вы применить инверсию зависимостей .

0 голосов
/ 14 августа 2013

Простой ответ, очевидно, это не может быть сделано.Либо вам придется сообщить своим бизнес-объектам о вашем слое данных (обязательно используйте DI, если вы идете по этому пути), либо вы не можете выполнять отложенную загрузку из бизнес-класса.Хорошей средой может быть создание класса обслуживания, который знает как о работе DAL, так и о вашем бизнес-уровне и знает, как загружать и создавать бизнес-объекты.Конечно, как сказала Хуанма, ОРМ были созданы для таких вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...