Tôi muốn hỏi một số câu hỏi về các thực tiễn tốt nhất về các loại ánh xạ và sử dụng các phương thức mở rộng trong C #. Tôi biết chủ đề này đã được thảo luận nhiều lần trong vài năm qua, nhưng tôi đã đọc rất nhiều bài viết và vẫn còn nghi ngờ.
Vấn đề tôi gặp phải là mở rộng lớp mà tôi sở hữu với chức năng "chuyển đổi". Hãy nói rằng tôi có lớp "Người" đại diện cho một đối tượng sẽ được sử dụng bởi một số logic. Tôi cũng có một lớp "Khách hàng" đại diện cho phản hồi từ API bên ngoài (thực tế sẽ có nhiều hơn một API, vì vậy tôi cần ánh xạ mỗi phản hồi của API theo loại chung: Person). Tôi có quyền truy cập vào mã nguồn của cả hai lớp và về mặt lý thuyết có thể thực hiện các phương thức của riêng tôi ở đó. Tôi cần chuyển đổi Khách hàng thành Người để tôi có thể lưu nó vào cơ sở dữ liệu. Dự án không sử dụng bất kỳ trình ánh xạ tự động.
Tôi có 4 giải pháp khả thi trong đầu:
Phương thức .ToPerson () trong lớp Người tiêu dùng. Nó đơn giản, nhưng có vẻ như phá vỡ mẫu Trách nhiệm đơn đối với tôi, đặc biệt là lớp Người tiêu dùng được ánh xạ tới các lớp khác (một số được yêu cầu bởi API bên ngoài khác), do đó, nó sẽ cần chứa nhiều phương thức ánh xạ.
Trình xây dựng ánh xạ trong lớp Person lấy Consumer làm đối số. Cũng dễ dàng và cũng có vẻ như phá vỡ mô hình Trách nhiệm đơn. Tôi cần phải có nhiều hàm tạo ánh xạ (vì sẽ có lớp từ một API khác, cung cấp cùng một dữ liệu như Người tiêu dùng nhưng ở định dạng hơi khác nhau)
Lớp chuyển đổi với các phương thức mở rộng. Bằng cách này, tôi có thể viết phương thức .ToPerson () cho lớp Người tiêu dùng và khi một API khác được giới thiệu với lớp NewConsumer của riêng nó, tôi chỉ có thể viết một phương thức mở rộng khác và giữ tất cả trong cùng một tệp. Tôi đã nghe một ý kiến rằng các phương pháp mở rộng nói chung là xấu xa và chỉ nên được sử dụng nếu thực sự cần thiết vì vậy đó là những gì đang giữ tôi lại. Nếu không thì tôi thích giải pháp này
Lớp chuyển đổi / Mapper. Tôi tạo lớp riêng biệt sẽ xử lý các chuyển đổi và triển khai các phương thức sẽ lấy thể hiện của lớp nguồn làm đối số và trả về thể hiện của lớp đích.
Tóm lại, vấn đề của tôi có thể được giảm xuống số lượng câu hỏi (tất cả theo ngữ cảnh với những gì tôi đã mô tả ở trên):
Việc đặt phương thức chuyển đổi bên trong đối tượng (POCO?) (Như phương thức .ToPerson () trong lớp Người tiêu dùng) có được coi là phá vỡ mẫu trách nhiệm đơn lẻ không?
Việc sử dụng các hàm tạo chuyển đổi trong lớp (giống như DTO) có được coi là phá vỡ mẫu trách nhiệm đơn lẻ không? Đặc biệt là nếu lớp như vậy có thể được chuyển đổi từ nhiều loại nguồn, vì vậy nhiều hàm tạo chuyển đổi sẽ được yêu cầu?
Việc sử dụng các phương thức mở rộng trong khi có quyền truy cập vào mã nguồn lớp gốc được coi là thực tiễn xấu? Hành vi như vậy có thể được sử dụng như một mô hình khả thi để phân tách logic hay nó là một mô hình chống?
Person
lớp một DTO? nó có chứa bất kỳ hành vi?