Использование атрибутов для нормализации и валидации бизнес-сущностей

ОГЛАВЛЕНИЕ

В корпоративном программировании при проектировании уровня доступа к данным часто встает вопрос работы с бизнес-объектами(бизнес-сущностями): это загрузки/изменения/сохранения и перемещения между уровнями. Существует два основных подхода для этого - использование собственных бизнес-сущностей или стандартных средств (ADO.NET предоставляет достаточно удобные способы для этого) - использование DataSet. Как пишет Дино Эспозито:

В объекты DataSet встроена поддержка параллельного доступа с нежесткой блокировкой. Они позволяют определять и использовать сложные отношения между таблицами. Кроме того, объекты DataSet поддерживают сериализацию, а при изменении схемы базы данных, как правило, не требуется вносить соответствующие изменения в API уровня доступа к данным.

Однако не всегда удобно манипулировать DataSet-ами, особенно в случае большой детерминированности структуры данных. Достаточно сложно привязывать(bind) таблицы к спискам (Repeater, DataGrid) в ASP.NET страницах. Кроме того, DataSet при всем своем удобстве передачи между процессами относительно громоздок по размеру и может достаточно долго сериализоваться/десериализоваться, занимая при этом циклы процессора и оперативную память. Основная альтернатива этому способу - создание собственных бизнес-сущностей, более подходящих в случае основного упора на работу с данными экземпляров и скалярными значениями. Бизнес-сущность это класс, инкапсулирующий в себе данные, относящиеся к какой-либо отдельной сущности (например, пользователь, заказ, товар).

Бизнес-сущность может иметь различные методы для работы с содержащимися данными, может использовать методы фабрик данных для управления своим жизненным циклом. Одной из основных операций, производимых с БС, является отображение её данных пользователю (я имею в виду в первую очередь WinForms, но к ASP.NET это относится также) и сохранение внесенных пользователем изменений в БД или других хранилищах. Здесь также возникает дополнительная задача - необходимо позволить пользователю вводить только корректные данные.
В книге "Analyzing Requirements and Defining Microsoft® .NET Solution Architectures" (далее 70-300) написано:

In addition to the performance of the database, you need to ensure the quality of the data stored by the database. This means that the database implements data integrity and stores valid data that conforms to the business rules.

то есть, вы должны обеспечить не только производительность работы с БД, но и качество хранящихся в ней данных.