Шаблоны проектирования: нужна помощь, чтобы понять эту концепцию и то, как она применима к моему проекту - PullRequest
1 голос
/ 08 декабря 2010

В последние несколько дней я провел много исследований с использованием подхода DAL / BLL / UI без четкого понимания того, как он будет применяться в моем проекте. В прошлом я не использовал BLL, соединяющий мой интерфейс непосредственно с уровнем доступа к данным (LINQtoSQL dbml). Но я не думаю, что это хорошая идея, когда я работаю сейчас (или, может быть, даже в прошлом), потому что у нас много разных приложений, и я хотел бы использовать один и тот же DAL / BLL, как они созданы.

Мой вопрос заключается в том, как BLL помогает мне, когда в большинстве моих приложений все, что я на самом деле делаю, - это использую LinqtoSqlDataSource / GridView для подключения к моему тексту данных, чтобы позаботиться обо всем обновлении / редактировании и т. Д. Кроме того, Каждое новое веб-приложение на каком-то уровне потребует уникальных изменений в DAL / BLL для получения требуемых данных, что может повлиять на другие приложения, использующие тот же DAL / BLL. Является ли это повторное использование DAL / BLL правильным способом или я что-то упустил?

Я думаю, что BLL приходит, когда мне нужно создать, например, классы безопасности для различных веб-приложений, которые будут созданы. Но когда я использую источник Linqtosqldatasource, зачем мне его подключать к BLL?

DAL

  • LinqToSQL dbml DataContext.
  • Меняет ли использование LinqToSQL способ использования этого дизайна?

BLL

  • Безопасность для различных веб-сайтов, используемых компанией.
  • Запрос DAL возвращает what (?) При использовании LinqToSQLDatSource., Функций, которые обрабатывают различные наборы результатов (я действительно не уверен, как это должно работать с BLL, извините, если вопрос неясен)

UI

  • Ссылка только на BLL?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2010

DAL и BLL разделены одной часто тонкой, но ключевой разницей; бизнес логика. Звучит мрачно просто, но позвольте мне объяснить подробнее, потому что различия могут быть ОЧЕНЬ хорошими и в то же время оказывать огромное влияние на архитектуру.

Используя Linq2SQL, среда генерирует очень простые объекты, каждый из которых представляет одну запись в одной таблице. Эти объекты являются DTO; это легковесные классы POCO (Plain Ol 'CLR Object), которые имеют только поля. Среда Linq2SQL знает, как создавать и обрабатывать эти объекты из данных БД, и аналогичным образом она может переваривать данные, содержащиеся в одном объекте, в SQLDML, который создает или обновляет запись БД. Тем не менее, на этом уровне известно мало или ни одно из правил, регулирующих отношения между полями различных объектов.

Ваша фактическая модель домена должна быть умнее этой; по крайней мере, достаточно умен, чтобы знать, что свойство объекта Order с именем SubTotal должно быть равно сумме всех ExtendedCosts всех OrderLines, и, аналогично, ExtendedCost должен быть продуктом UnitPrice и количества. Во многих современных программах ваш домен является частью вашего BLL, по крайней мере, до такой степени. Объекты, созданные Linq2SQL, вероятно, не должны знать все это, особенно если вы не сохраняете SubTotal или ExtendedCost. Если вы полагаетесь на DTO Linq2SQL, вы в основном привязали себя к тому, что называется моделью анемичного домена, которая является известным анти-паттерном. Если объект домена, по крайней мере, не может поддерживать себя внутренне согласованным, то любой объект, который работает с объектом домена, должен быть доверенным, чтобы сохранить его таким образом, требуя, чтобы все эти объекты знали правила, которые им не должны.

Пользовательский интерфейс должен знать о домене, или, если вы предпочитаете, он должен знать какой-то абстрактный способ получения данных из домена для целей чтения-записи (обычно инкапсулируется в объекты, называемые контроллерами, которые работают с уровнем домена и / или Linq2SQL). Пользовательский интерфейс НЕ должен знать о БД в любой программе среднего размера или больше; либо доменные объекты могут увлажнять себя с помощью ссылки на объекты в DAL, либо они создаются пользовательскими объектами в DAL, которые вы создаете для гидратации, которые затем передаются контроллеру. Подключенная модель ADO и взаимодействие с GridView восхитительны, но не позволяют абстрагироваться. Допустим, вы хотите вставить слой веб-службы между доменом и пользовательским интерфейсом, чтобы пользовательский интерфейс мог быть размещен в мобильном приложении, которое работало с данными в вашем хранилище. Вам придется перестроить свой пользовательский интерфейс, потому что вы больше не можете напрямую получать объекты из Linq2SQL; Вы получаете их из веб-сервисов. Если у вас есть уровень контроллера, который взаимодействует с Linq2SQL, вы можете заменить этот уровень контроллерами, которые взаимодействуют с веб-сервисами. Это звучит как небольшая разница; Вы всегда должны что-то менять. Но теперь вы используете ТОЧНО один и тот же пользовательский интерфейс в мобильных и настольных приложениях, поэтому изменения на ЭТОМ уровне не нужно вносить дважды только потому, что два слоя получают данные разными способами.

0 голосов
/ 09 декабря 2010

Это отличный вопрос, который я размышлял с нашим приложением каталога уже год.Конкретный пример для меня может помочь вам с шаблоном.

У меня есть страница для отображения содержимого корзины покупок.В первые дни на этой странице была сетка, заполненная результатами хранимой процедуры SQL, которая, учитывая номер заказа, перечисляла элементы в корзине.

Теперь у меня есть объект BLL 'cart',содержит коллекцию объектов 'row'.Сетка та же, но источником данных являются строки корзины.

Почему я это сделал?Изначально не из-за каких-то модных дизайнерских паттернов.У меня было так много особых случаев для обработки на основе полей в каждой строке И у меня были другие места, в которых мне нужно было отображать те же данные содержимого корзины, что имело больше смысла для создания объектов.Теперь корзина загружается из репозитория, и мои страницы понятия не имеют, что делает этот репозиторий.Черт возьми, для тестирования это жестко закодированные данные корзины.

Затем корзина использует репозиторий для загрузки строк.В каждой строке есть логика для манипулирования собой, не зная, откуда поступили данные.

Надеюсь, это поможет?

...