Tôi tự hỏi bởi vì nếu có, tại sao Entity Framework không cung cấp logic để tạo một đối tượng mới có cùng thuộc tính để truyền dữ liệu giữa các lớp?
Tôi sử dụng các đối tượng thực thể mà tôi tạo ra với khung thực thể.
Tôi tự hỏi bởi vì nếu có, tại sao Entity Framework không cung cấp logic để tạo một đối tượng mới có cùng thuộc tính để truyền dữ liệu giữa các lớp?
Tôi sử dụng các đối tượng thực thể mà tôi tạo ra với khung thực thể.
Câu trả lời:
Điêu đo phụ thuộc vao bạn.
Hầu hết mọi người sẽ nói với bạn rằng đó không phải là một thực hành tốt nhưng bạn có thể thoát khỏi nó trong một số trường hợp.
EF không bao giờ chơi độc đáo với DDD vì nhiều lý do, nhưng hai lý do nổi bật: bạn không thể có các hàm tạo tham số hóa trên các thực thể của mình và bạn không thể gói gọn các bộ sưu tập. DDD dựa vào đó, vì mô hình miền nên bao gồm cả dữ liệu và hành vi.
Theo một cách nào đó, EF buộc bạn phải có một mô hình miền thiếu máu và trong trường hợp này bạn có thể sử dụng các thực thể làm DTOs. Bạn có thể gặp phải một số vấn đề nếu bạn sử dụng các thuộc tính điều hướng nhưng bạn có thể tuần tự hóa các thực thể đó và gửi chúng qua dây. Nó có thể không thực tế mặc dù. Bạn sẽ phải kiểm soát việc tuần tự hóa cho từng thực thể có các thuộc tính bạn không cần gửi qua. Cách dễ dàng hơn là chỉ cần thiết kế các lớp riêng biệt được thiết kế để truyền dữ liệu. Các thư viện như AutoMapper được tạo ra cho mục đích này.
Ví dụ: Giả sử bạn có một lớp được gọi Person
với định nghĩa sau:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; get; }
// plus a bunch of other properties relevant about a person
}
Giả sử bạn muốn hiển thị một danh sách các nhân viên nơi nào đó, nó có thể được thực hiện để gửi chỉ là Id
, FirstName
và LastName
. Nhưng bạn sẽ phải gửi qua tất cả các thuộc tính không liên quan khác. Đó không phải là vấn đề lớn nếu bạn không quan tâm đến quy mô của phản hồi nhưng ý tưởng chung là chỉ gửi dữ liệu liên quan. Mặt khác, bạn có thể thiết kế một API trả về danh sách những người và trong trường hợp đó, việc gửi tất cả các thuộc tính có thể là cần thiết, do đó, có ý nghĩa để tuần tự hóa và gửi các thực thể. Trong trường hợp này, việc tạo một lớp DTO là điều gây tranh cãi. Một số người thích trộn lẫn các thực thể và DTO, một số người thì không.
Để trả lời câu hỏi cập nhật của bạn, EF là một ORM. Công việc của nó là ánh xạ các bản ghi cơ sở dữ liệu tới các đối tượng và ngược lại. Những gì bạn làm với những đối tượng đó trước và sau khi đi qua EF không phải là một phần của mối quan tâm. Cũng không nên.
Không có nó không phải là.
Lý tưởng nhất, các DTO sẽ phù hợp với kho lưu trữ liên tục của bạn (hay còn gọi là bảng cơ sở dữ liệu của bạn).
Nhưng các lớp kinh doanh của bạn không nhất thiết phải là một trận đấu. Bạn có thể cần các lớp bổ sung, hoặc tách hoặc tham gia các lớp với những gì bạn có trong cơ sở dữ liệu. Nếu ứng dụng của bạn nhỏ, bạn có thể không thực sự thấy loại vấn đề này, nhưng trong các ứng dụng từ trung bình đến lớn, điều này sẽ xảy ra thường xuyên.
Một điều nữa là các DTO là một phần của miền bất cứ điều gì liên quan đến sự kiên trì, trong khi Lớp doanh nghiệp của bạn không nên biết gì về chúng.
Nó thực sự là một ý tưởng rất xấu. Martin Fowler có một bài viết về DTOs địa phương .
Tóm lại, DTO
Mẫu được sử dụng để truyền dữ liệu ngoài quy trình, ví dụ qua dây và không phải giữa các lớp trong cùng một quy trình.
Không, đó là một thực tế xấu.
Một số lý do:
@JsonIgnore
từ thế giới Java), nhưng điều này dẫn đến vấn đề tiếp theo ...get
phương thức của thực thể.Vì vậy, sẽ dễ dàng và an toàn hơn khi sử dụng một số loại công cụ ánh xạ để giúp bạn thực hiện công việc này, ánh xạ các trường thực thể thành Dto.
Để hoàn thành những gì @Dherik đã nói, các vấn đề chính của việc sử dụng các đối tượng thực thể làm đối tượng truyền dữ liệu là:
Trong giao dịch, bạn chấp nhận rủi ro để thực hiện các thay đổi được thực hiện trên thực thể của mình vì bạn sử dụng nó làm DTO (ngay cả khi bạn có thể tách rời thực thể của phiên trong giao dịch, hầu hết thời gian bạn sẽ cần kiểm tra trạng thái này trước bất kỳ sửa đổi nào trên DTO thực thể của bạn và đảm bảo rằng bạn không tham gia giao dịch hoặc phiên đã bị đóng nếu bạn không muốn các sửa đổi được duy trì).
Kích thước dữ liệu bạn chia sẻ giữa máy khách và máy chủ: đôi khi bạn không muốn gửi tất cả nội dung của một thực thể đến máy khách để giảm thiểu kích thước phản hồi của yêu cầu. Việc tách DTO khỏi thực thể linh hoạt hơn, để chuyên môn hóa dữ liệu mà bạn muốn gửi trong các trường hợp sử dụng nhất định.
Khả năng hiển thị và bảo trì: Bạn phải quản lý các chú thích jpa / hibernate của mình trên các trường của thực thể và duy trì các chú thích jackson để tuần tự hóa trong json tại cùng một nơi (ngay cả khi bạn có thể tách chúng khỏi thực thi thực thể để đặt chúng vào giao diện được kế thừa bởi thực thể). Sau đó, nếu bạn thay đổi nội dung DTO của mình khi thêm trường mới, một người khác có thể nghĩ rằng đó là trường của thực thể, do đó, trường của bảng có liên quan trong cơ sở dữ liệu của bạn (ngay cả khi bạn có thể sử dụng @Transient
chú thích trên tất cả các trường DTO của mình đối với trường hợp ..!).
Theo tôi, nó tạo ra tiếng ồn khi bạn đọc thực thể, nhưng ý kiến của tôi chắc chắn là chủ quan.