2013-11-01 1 views
0

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

Однако я немного запутался в своем проекте, потому что не уверен, правильно ли я структурировал свое приложение для этого сценария.

В основном я пытаюсь получить список продуктов из базы данных, которые попадают под определенный порог цены. На данный момент у меня есть функция в моем слое данных, которая в основном возвращает все продукты, где цена> минимальный порог и цена < максимальный порог. Но мне казалось, что это неправильно. Должен ли слой данных просто возвращать список ВСЕХ продуктов, а затем бизнес-логику выполняет фильтрацию?

Я довольно смущен тем, должен ли слой данных просто предоставлять методы, позволяющие бизнес-уровню получать необработанные данные или же он должен отвечать за получение фильтрованных данных тоже?

Если у кого-то есть статья или что-то, объясняющая это подробно, это было бы очень полезно.

Благодаря

ответ

1

Целью уровня данных является взаимодействие, связанное с данными, с репозиторием данных. Если вы хотите получить действительно чистый, вы можете отделить слой данных на две части: D ата A bstraction L Айер и D ата I ndependence L Айер. DIL отвечает за сбор правильного запроса для репозитория данных, с которым вы взаимодействуете (например, вы можете предложить выбор SQL Server или Oracle), тогда как DAL находится поверх DIL и вызывает соответствующие методы для получения данных (например, он может указывать хранимую процедуру для вызова или таблицы/просмотра для запроса, но DIL отвечает за фактически выполнение вызова).

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

public YourDataObjects[] GetProducts(decimal lowerPrice, decimal upperPrice) { ... } 

Я использовал массив для возвращаемого типа, потому что почти все языки имеют, что (вы не указали, какой язык вы используете), это также является причиной использования типа decimal для пороговых значений.

+0

Спасибо, это то, что я подозревал. Я полагал, что единственной ответственностью слоя данных было взаимодействие с хранилищем данных. – alimac83

1

Там нет реального правильного или неправильного способа здесь, как правило, сводится к тому, что лучше всего подходит для вашей реализации.

Цель создания «уровня данных» или «модели» заключается в том, что при необходимости вы можете с относительной легкостью заменить свой уровень персистентности для чего-то совершенно другого и иметь все, что только работает.

То есть, я, как правило, включают в себя функциональные возможности для фильтрации возвращенного записей как часть моей модели, что-то вроде:

public IEnumerable<object> getAllRows() 
public object getSingle(object o) 
public IEnumerable<object> getFilteredRows(Expression<object> e) 

Выражение для фильтрации результатов будет сгенерирована в бизнес-уровне (контроллер) но фактическое его выполнение будет обрабатываться данными позже (модель).