2010-12-09 2 views
2

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

У меня есть уровень доступа к данным, который отвечает за взаимодействие с различными элементами хранения данных и возвращает POCOs или коллекции POCOs при запросе вещей.

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

Например, у меня есть таблица SQL-собак, мой уровень доступа к данным может вернуть этот список собак в виде коллекции объекта Dog. Тогда мой бизнес-уровень будет делать такие вещи, как отфильтровать собак ниже определенного возраста или любую другую фильтрацию или преобразование, которые должны были произойти на основе бизнес-правил.

Мой вопрос в том, что. Каков наилучший способ обработки фильтрующих объектов на основе связанных записей? Скажем, я хочу всех людей, у которых есть Кошки. Сейчас мой уровень доступа к данным может вернуть всех кошек и всех людей, но для меня не фильтрует.

можно осуществить фильтрацию с помощью метода отличается доступа к данным (т.е. DAO.GetCatPeople()), но это может усложниться, если у меня есть множество связанных свойств или отношений для обработки

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

Я могу написать интерфейс фильтрации данных, и если мой слой доступа к данным изменит этот слой, он также изменится.

Есть ли некоторые известные передовые методы, на которых я мог бы извлечь выгоду?

ответ

2

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

  • Data Centric - это материал, подобный CRUD, и другие общие/очевидные вещи, которые не имеют проблем.
  • «Использовать случай» в центре, где вы определяете интерфейс и сопоставляете POCO для определенной цели. [Возможно, я пропустил какую-то общую терминологию здесь, но я использую значение «Case Case»)

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

Должны ли кошки и собаки знать друг о друге? Если они существуют в рамках одной и той же модели домена и установили отношения внутри этой модели - тогда да, конечно, вы должны иметь возможность делать запросы, такие как GetCatPeople().

Что касается управления сложностью, то вместо GetCatPeople() у вас может быть более общий метод, в котором атрибут принимался как параметр: GetPeopleByAnimal(animal).