Một mẫu phổ biến mà tôi thấy là mẫu được gọi là Mapper
mẫu (không bị nhầm lẫn với mẫu DataMapper
hoàn toàn khác), dùng làm đối số của một loại nguồn dữ liệu "thô" (ví dụ: ADO.NET DataReader
hoặc DataSet
) và ánh xạ các trường tới thuộc tính trên một đối tượng kinh doanh / tên miền. Thí dụ:
class PersonMapper
{
public Person Map(DataSet ds)
{
Person p = new Person();
p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
// other properties...
return p;
}
}
Ý tưởng là Cổng / DAO / Kho lưu trữ của bạn / v.v. sẽ gọi vào Mapper trước khi nó trả về, do đó bạn có được một đối tượng kinh doanh phong phú so với vùng chứa dữ liệu cơ bản.
Tuy nhiên, điều này dường như có liên quan, nếu không giống hệt với mẫu Factory (theo cách nói của DDD, dù sao), nó xây dựng và trả về một đối tượng miền. Wikipedia nói lại điều này: Nhà máy DDD:
Factory: các phương thức tạo đối tượng miền nên ủy quyền cho một đối tượng Factory chuyên biệt sao cho việc triển khai thay thế có thể dễ dàng thay thế cho nhau.
Từ trích dẫn đó, điểm khác biệt duy nhất tôi có thể nghĩ là Nhà máy kiểu DDD có thể được tham số hóa để có thể trả về một loại đối tượng chuyên biệt nếu nhu cầu nảy sinh (ví dụ: BusinessCustomer so với ResidCustomer) trong khi "Mapper" được khóa vào một lớp cụ thể và chỉ dịch.
Vì vậy, có sự khác biệt giữa hai mẫu này hay về cơ bản chúng là cùng một thứ với các tên khác nhau?
DataMapper
mô hình đã tự truy cập cơ sở dữ liệu, trong khi "Mapper" này không lấy từ cơ sở dữ liệu, chỉ chuyển đổi một tập kết quả của một loại nào đó thành một đối tượng.