DAL и BLL с отложенной загрузкой - PullRequest
3 голосов
/ 25 августа 2010

Как реализовать ленивую загрузку в контексте трех уровней? Я понимаю базовую архитектуру уровня представления, бизнес-уровня и уровня данных:

У вас есть базовые «тупые» классы, которые являются почти зеркальными изображениями таблиц в базе данных за одним исключением. Вместо идентификаторов внешнего ключа у вас есть ссылка на фактический экземпляр (ы) того, на что ссылаются. Например: Сотрудник со свойствами Name / DOB / Title.

Затем для каждого из этих классов у вас есть класс, который обеспечивает операции CRUD над ним плюс любые пользовательские подпрограммы хранения данных, которые вам могут понадобиться (вызов хранимой процедуры, которая работает с этим объектом и т. Д.). Этот класс будет заменен, если вы изменили базу данных. Например: EmployeeDAL.Save (myEmployee), EmployeeDAL.Get (myEmployee) (где myEmployee имеет свой идентификатор, но ничего больше)

У вас есть классы бизнес-уровня, которые выполняют проверку, а что нет. Методы в этих классах обычно заканчиваются вызовом DAL для сохранения информации или ее получения. Это меняется, когда клиент меняет свое мнение о том, что представляет собой действительные / недействительные данные, или хочет изменить способ выполнения какого-либо вычисления.

Уровень представления взаимодействует с бизнес-уровнем для отображения объектов и передачи вставок / обновлений, сделанных в пользовательском интерфейсе, на нижние уровни. Например: он просматривает список сотрудников и отображает их в таблице HTML.

Но где именно будет идти код для отложенной загрузки ссылок? Если на уровне представления есть объект Company, который он только что отобразил, и начинается процесс отображения myCompany.Employees, как это достигается? myCompany является экземпляром одного из тупых классов, которые зеркально отражают таблицы базы данных, и не должен знать о том, как что-либо получить.

Делаете ли вы в качестве ответа на этот вопрос и предлагаете создать фиктивную версию каждого объекта? Тогда объект уровня DAL может иметь переменные, указывающие, загружены ли сотрудники или нет, и вызывать DALEmployee.GetEmployees (this)? Я чувствую, как будто я упускаю что-то решающее в шаблоне ...

1 Ответ

0 голосов
/ 25 августа 2010

Если вы используете предварительно созданный фреймворк, такой как nHibernate, это сделает все это намного проще, вы можете определить ленивую загрузку в отображении класса / таблицы и при запуске запроса.Чтобы сделать это самостоятельно аккуратно, потребуется немало кода, хотя класс System.Lazy в .NET 4 может помочь.

...