Đối với câu hỏi 1 và 2 đi với câu trả lời của Matthew.
Tôi đã dành rất nhiều thời gian để cố gắng tìm ra cách tốt nhất để cấu trúc DAL của các ứng dụng máy tính để bàn. Và cách tốt nhất thực sự phụ thuộc vào nhu cầu của ứng dụng. Trong một trong những ứng dụng của mình, tôi đã có một lớp DA cho mỗi bảng cơ sở dữ liệu, nó đã đăng ký chính nó với một lớp DataProvider trung tâm (ví dụ như singleton) và xử lý CRUD. Mỗi lớp DA sau đó có thể quyết định liệu nó có muốn lưu trữ tất cả dữ liệu bảng trong RAM hay không (hiệu suất!) Và / hoặc liệu nó có cần kích hoạt cập nhật máy khách tự động trong các máy khách khác chạy trên các máy tính khác hay không đồng thời). Điều này giúp dễ dàng thêm các lớp DAL mới, vì tất cả những gì họ phải làm là tuân thủ giao diện đăng ký.
Không phải mọi DAL đều cần loại chức năng này, nhưng tôi đã học được rằng chính cách tiếp cận (tức là nhà cung cấp dữ liệu đơn lẻ và các lớp DAL đơn giản với đăng ký tĩnh) giúp cuộc sống của tôi dễ dàng hơn rất nhiều khi tôi bắt đầu thêm các lớp mới.
Tôi chắc chắn sẽ không khuyên bạn nên xây dựng CRUD thành các lớp cấp cao hơn, trừ khi đây là một ứng dụng rất đơn giản. DAL là một sự trừu tượng của việc lưu trữ dữ liệu. Nếu bạn quyết định thay đổi lưu trữ dữ liệu của mình tại một thời điểm nào đó trong tương lai (ngay cả khi chỉ sử dụng MySQL thay vì MS SQL), bạn sẽ rất biết ơn vì điều đó. Plus: Các đối tượng BLL nên được cấu trúc bởi các mối quan hệ logic kinh doanh của chúng. Các đối tượng DAL được cấu trúc bởi các loại container lưu trữ mà chúng đại diện. Sự khác biệt có thể là kịch tính.
Đừng KHÔNG làm cho lớp DAL tĩnh của bạn. Những gì bạn đạt được về tốc độ mã hóa, bạn sẽ mất nhiều lần so với khả năng kiểm tra và tính linh hoạt.