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