Tôi đang cố gắng cải thiện các kỹ năng mẫu thiết kế của mình và tôi tò mò sự khác biệt giữa các mẫu này là gì? Tất cả chúng có vẻ giống nhau - đóng gói logic cơ sở dữ liệu cho một thực thể cụ thể để mã gọi không có kiến thức về lớp lưu giữ cơ bản. Từ nghiên cứu ngắn gọn của tôi, tất cả chúng thường thực hiện các phương pháp CRUD tiêu chuẩn của bạn và loại bỏ các chi tiết cụ thể về cơ sở dữ liệu.
Ngoài các quy ước đặt tên (ví dụ: CustomerMapper so với CustomerDAO so với CustomerGateway so với CustomerRep repository), sự khác biệt là gì, nếu có? Nếu có sự khác biệt, khi nào bạn sẽ chọn cái này hơn cái kia?
Trước đây tôi sẽ viết mã tương tự như sau (đơn giản hóa, tự nhiên - tôi thường không sử dụng các thuộc tính công cộng):
public class Customer
{
public long ID;
public string FirstName;
public string LastName;
public string CompanyName;
}
public interface ICustomerGateway
{
IList<Customer> GetAll();
Customer GetCustomerByID(long id);
bool AddNewCustomer(Customer customer);
bool UpdateCustomer(Customer customer);
bool DeleteCustomer(long id);
}
và có một CustomerGateway
lớp thực hiện logic cơ sở dữ liệu cụ thể cho tất cả các phương thức. Đôi khi, tôi sẽ không sử dụng một giao diện và làm cho tất cả các phương thức trên CustomerGateway tĩnh (tôi biết, tôi biết, điều đó làm cho nó ít kiểm tra hơn) vì vậy tôi có thể gọi nó như sau:
Customer cust = CustomerGateway.GetCustomerByID(42);
Đây dường như là cùng một nguyên tắc cho các mẫu Kho lưu trữ dữ liệu và Kho lưu trữ dữ liệu; mô hình DAO (giống như Gateway, tôi nghĩ vậy?) dường như cũng khuyến khích các cổng cụ thể của cơ sở dữ liệu.
Tui bỏ lỡ điều gì vậy? Có vẻ hơi kỳ lạ khi có 3-4 cách khác nhau để làm cùng một điều chính xác.