2009-12-04 5 views
3

Я довольно новичок программист, который пытается изучить основы n-слоистой архитектуры (DAL, BLL, UI). Приложение, которое я программирую, представляет собой одноуровневое трехслойное приложение, написанное на VB.NET (.Net 3.5). Слои следующим образом:Как передавать данные между BLL и UI в трехслойном (одноуровневом) приложении?

DAL

BLL

UI

COMMON - содержит право DTO теперь.

У меня возникли проблемы с определением того, что нужно пройти между моим BLL и UI. Мой инстинкт подсказывает мне, что я должен только передавать данные в пользовательский интерфейс, а не полный бизнес-объект из BLL. Рассмотрим два сценария:

1) Передайте BO непосредственно из BLL в UI. Это предоставляет методы BO и позволяет UI напрямую обращаться к BO, что кажется плохим.

2) Передайте только соответствующие данные от BO к пользовательскому интерфейсу. Например, у клиента есть имя и адрес. Эти данные действительно показывают, что мы хотим отображать/редактировать в пользовательском интерфейсе, поэтому мы будем возвращать эти данные только пользовательскому интерфейсу, а не полному BO. Пользовательский интерфейс затем будет звонить в BLL для обновления определенного BO.

Я склонен использовать # 2, но я не знаю, как его реализовать. То, как я его запрограммировал сейчас, если я только верну данные из BLL, все ссылки на мои BO будут потеряны, и GC заявит о них. Исходя из этого, у меня есть некоторые вопросы:

1) Должен ли я поддерживать бизнес-объекты между вызовами BLL? Альтернативой является повторное создание их каждый раз, когда я передаю данные через BLL, что кажется неправильным.

2) Что такое лучший способ сохранить BO живой в одной архитектуре уровня (как держать ссылку, если мы не передать его в пользовательский интерфейс?)

3) Как многоуровневые приложения делают это? Сохраняют ли они BO в BLL и ждут обновления от пользовательского интерфейса? Разве это не требует много «бухгалтерского учета» в BLL, чтобы убедиться, что BO выпущены, когда они больше не нужны?

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

+0

эта тема полезна: http://stackoverflow.com/questions/518329/what-objects-should-you-return-from-the-data-access-layer-to-the-business-layer-a/ 518386 # 518386 –

+0

Спасибо, Чад, я прочитал эту тему. Кажется, что «менеджер» для каждого бизнес-объекта движется к модели анемичного домена, не так ли? –

ответ

0

См Pet Shop в качестве примера трехслойной архитектуры. Я реализую как BLL, так и DAL как объект сервиса, который сам по себе не содержит состояний. Поскольку они без гражданства, я могу использовать шаблон singleton, и пусть factory держится за него для удобства.

Вот некоторые методы пример CRUD вы могли бы:

FooInfo DALFactory.FooService.Retrieve(int id); 
FooInfo BLLFactory.FooService.Retrieve(int id); 

IList<FooInfo> DALFactory.FooService.RetrieveAll; 
IList<FooInfo> BLLFactory.FooService.RetrieveAll; 

FooInfo DALFactory.FooService.Create(FooInfo entity); 
FooInfo BLLFactory.FooService.Create(FooInfo entity); 

FooInfo DALFactory.FooService.Edit(FooInfo entity); 
FooInfo BLLFactory.FooService.Edit(FooInfo entity); 

void DALFactory.FooService.Delete(FooInfo entity); 
void BLLFactory.FooService.Delete(FooInfo entity); 

Как вы можете видеть, в обоих случаях, вы передаете тот же объект сущности (он же данные объекта передачи), который не имеет никакой логики вообще. Эта архитектура позволяет отключить уровень пользовательского интерфейса от BLL по линии до богатого клиента и веб-сервисов.

Намерение метода Retrieve и RetrieveAll состоит в том, чтобы захватить данные из базы данных и передать их в объект сущности. Метод Create добавляет новую строку в базу данных на основе данного объекта. В этой архитектуре нет «бизнес-объекта» помимо бизнес-логического слоя BLLFactory.FooService и объекта FooInfo.

С точки зрения срока службы этих объектов, stateless BLLFactory.FooService создается один раз и будет использоваться повторно, пока приложение будет живым. FooInfo может быть создан один раз для каждого объекта, а затем сохранен в сеансе ASP.NET или что-то в этом роде.

+0

Итак, когда вы извлекаете данные для отображения пользователю, набор BO создается, а затем выгружается. Когда пользователю нужно обновить некоторые данные, новые BO будут сгенерированы на обратном пути к DAL, правильно? Вы создаете новый BO в обоих направлениях? –

+0

Что такое BO? Если вы имеете в виду BLLFactory.FooService, он создается один раз и многократно используется повторно. –

+0

Извините, BO = Бизнес-объект. Если я правильно смотрю, ваш FooService создает бизнес-объект из DTO. Предположим, что наше приложение просто отображает некоторые данные, позволяет пользователю редактировать, а затем сохранять его. Создаются ли объекты, созданные FooService, в течение всего времени редактирования и сохранения, или они создаются один раз, когда данные отображаются и снова, когда данные сохраняются? –

0

Вот как я всегда делал это:

UI - ASP.Net или Windows, делает вызов веб-службы
SERVICE - это служба слоя, что пользовательский интерфейс вызывает
COMMON - DTO - Данные Передача объекта ключ во имя
BLL - Содержит бизнес-объекты и код для отображения DTOs в Business Objects и обратно только DTOS передаются на уровень сервиса
DAL - доступ к данным

+0

Спасибо, Берт, это то, чего я пытаюсь достичь. Поддерживает ли BLL связь между вызовами? Например, мы извлекаем данные для отображения в пользовательском интерфейсе, который создает BO в BLL. Сохраняются ли эти BO для использования в возвращении данных или они получаются разбитыми, а новые создаются, когда данные отправляются обратно в DAL для хранения? –

+0

Мы работаем над веб-сервисами, поэтому бизнес-объекты размещаются после каждого запроса. – Burt