Я всегда застревал между камнем и наковальней. В идеале ваша бизнес-логика вообще не будет связана с проблемами, связанными с базой данных или пользовательским интерфейсом.
Ключи вызывают проблемы. Тем не менее, я считаю, что такие вещи, как первичные и внешние ключи, вызывают проблемы. Даже такие инструменты, как Entity Framework, не устраняют полностью эту ползучесть. Преобразование идентификаторов, переданных в виде данных POST, в соответствующие объекты может быть крайне неэффективным, только для передачи их на бизнес-уровень, который затем передает их на уровень данных, чтобы снова их просто урезать.
Даже с базами данных NoSQL возникают проблемы. Они, как правило, возвращают полные объектные модели, но обычно возвращают больше, чем вам нужно, и могут привести к проблемам, поскольку вы предполагаете, что объектная модель не изменится. И ключи до сих пор находятся в базах данных NoSQL.
Повторное использование против накладных расходов. Существует также проблема повторного использования кода. Слои данных довольно часто возвращают полностью заполненные объекты, включая каждый столбец в этой конкретной таблице или таблицах. Однако часто бизнес-логика заботится только об ограниченном подмножестве этой информации. Он поддается специализированным объектам передачи данных, которые несут с собой только соответствующие данные. Конечно, вам нужно конвертировать между представлениями, поэтому вы создаете класс сопоставления. Затем, когда вы сохраняете, вам нужно каким-то образом преобразовать эти меньшие объекты обратно в полное представление базы данных или выполнить частичное ОБНОВЛЕНИЕ (то есть другую команду SQL).
Итак, я вижу множество классов бизнес-уровня, принимающих объекты, отображаемые непосредственно в таблицы базы данных (объекты передачи данных). Я также вижу, что многие бизнес-уровни также принимают необработанные значения пользовательского интерфейса (объекты представления). Также нет ничего необычного в том, что бизнес-уровни обращаются к базе данных в середине вычислений для получения необходимых данных. Пытаться получить его заранее, вероятно, будет неэффективно (подумайте о том, как if-statement может повлиять на извлекаемые данные), а ленивые загруженные значения приводят к большому количеству волшебных или непреднамеренных обращений к базе данных.
Сначала напишите свою логику. Недавно я пытался сначала написать "основной" код. Это код, который выполняет фактическую бизнес-логику. Не знаю, как вы, но много раз, просматривая чужой код, я задаю вопрос: «Но где это [бизнес-правило]?» Часто бизнес-логика настолько переполнена заботами о захвате данных, их преобразовании и так далее, что я даже не могу их увидеть (иголка в стоге сена). Итак, теперь я сначала реализую логику, и когда я выясняю, какие данные мне нужны, я добавляю их как параметр или добавляю их к объекту параметра. Приведение остальной части кода в соответствие с этим новым интерфейсом обычно приходится на какой-то посреднический класс.
Однако, как я уже сказал, вы должны помнить о многом при написании бизнес-уровней, в том числе о производительности. Вышеупомянутый подход был полезен в последнее время, потому что у меня еще нет прав на управление версиями или схему базы данных. Я работаю в темной комнате только со своим пониманием требований.
Пишите с тестированием в уме. Использование внедрения зависимостей может быть полезно для предварительного проектирования хорошей архитектуры. Попробуйте подумать о том, как бы вы протестировали свой код, не обращаясь к базе данных или другой службе. Это также позволяет создавать небольшие повторно используемые классы, которые могут работать в разных контекстах.
Заключение Я пришел к выводу, что на самом деле не существует идеального бизнес-уровня. Даже в одном приложении могут быть случаи, когда один подход работает только в 90% случаев. Лучшее, что мы можем сделать, это попытаться написать самое простое, что работает. Долгое время я избегал DTO и оборачивал ADO.NET DataRows объектами, чтобы обновления немедленно записывались в базовый DataTable. Это была ОГРОМНАЯ ошибка, потому что я не мог копировать объекты, а из-за ограничений в странные моменты возникали исключения. Я сделал это только для того, чтобы не указывать значения параметров явно.
person
Travis Parks
schedule
04.01.2013