Я пытаюсь получить четкий окончательный ответ на вопрос, который меня долго сводил с ума.
Обычно выражается, что BLL должен содержать Business Logic и Business Objects (BO) и иметь ссылку на DAL. DAL, с другой стороны, не может иметь ссылку на BLL, поэтому он не может принимать BO в качестве аргументов или возвращать BO в качестве возвращаемых значений.
Самый традиционный ответ на эту проблему:
a) Принять простые параметры и вернуть (желательно типизированные) наборы данных и таблицы данных для возврата данных:
пространство имен DAL {
общедоступный класс Контакты
public DataTable GetContacts () {...}
Публичное обновлениеКонтакты (DataTable contacts) {...}
b) Вторым наиболее рекомендуемым решением является определение временных, сериализуемых объектов передачи данных (DTO) (иногда называемых объектами значений (VO)), которые имеют только поля и свойства, не имеют методов и используются только для краткой передачи данные возвращаются в слой BLL, где они используются для заполнения новых BO, после чего они отбрасываются.
в) Используйте общую третью сборку (например, называемую Entities.dll), которая определяет BO и на которую ссылаются все 3 уровня: пользовательский интерфейс, BLL и DAL.
Вариант а) требует наименьшего количества работы для реализации (не нужно создавать другую сборку), поэтому и так часто предлагается, но в DataTables есть дополнительная разводка, которая не требуется для простых операций.
Все же очень неясно, какой из б) или в) лучше ...
Я вижу, что б) предлагалось иногда, и почти никогда не в), хотя в) кажется самым простым из двух.
Что мне не хватает? Почему в) так редко предлагается, даже если он кажется логически самым простым, и почему а) предлагается, когда он явно не подходит для всех сценариев (например, возврат отдельных объектов)?
Спасибо!