На питання 1 і 2 перейдіть з відповідями Метью.
Я витратив чимало часу, намагаючись зрозуміти найкращий спосіб структурувати DAL настільних додатків. І найкращий спосіб дійсно залежить від потреб програми. В одному зі своїх додатків я пішов дорогою, щоб мати клас DA для кожної таблиці баз даних, який зареєстрував себе центральним (тобто одиночним) класом DataProvider та обробляв CRUD. Кожен клас DA може потім вирішити, хоче він кешувати всі дані таблиці в оперативній пам’яті чи ні (продуктивність!) Та / або чи потрібно мати можливість запускати автоматичні оновлення клієнтів у інших клієнтів, що працюють на інших комп’ютерах (думаю, багатокористувацькі) паралельність). Це дозволяє легко додавати нові класи DAL, оскільки все, що їм потрібно зробити, - це відповідати реєстраційному інтерфейсу.
Не кожному DAL потрібен такий функціонал, але я дізнався, що сам підхід (наприклад, однотонний постачальник даних та прості класи DAL зі статичною реєстрацією) значно полегшив мені життя, коли я почав додавати нові класи.
Я б точно не рекомендував будувати CRUD на класах вищого рівня, якщо це не дуже проста програма. DAL - це абстрагування зберігання даних. Якщо ви вирішите змінити сховище даних у якийсь момент у майбутньому (навіть якщо це стосується лише використання MySQL замість MS SQL), ви будете дуже вдячні за це. Плюс: об'єкти BLL повинні бути структуровані за їхніми бізнес-логічними відносинами. DAL-об'єкти структуровані за типом контейнерів для зберігання, які вони представляють. Відмінності можуть бути драматичними.
Як НЕ зробити ваші класи DAL статичним. Що ви отримаєте у швидкості кодування, ви втратите багато разів у доказовості та гнучкості.