2010-05-30 19 views
5

Tôi đang làm việc trên một dự án sử dụng khung thực thể. Có được không khi sử dụng các lớp học một phần của các lớp học tạo ra EF như là lớp kinh doanh. Tôi bắt đầu nghĩ rằng đây là cách EF được dự định sử dụng.Tôi có nên sử dụng các lớp học một phần làm lớp nghiệp vụ khi sử dụng khung thực thể không?

Tôi đã cố gắng sử dụng mẫu DTO và sớm nhận ra rằng tôi chỉ đang tạo một loạt các lớp ánh xạ đang nhân đôi nỗ lực của mình và cũng là nguyên nhân cho công việc bảo trì và lớp bổ sung.

Tôi muốn sử dụng các thực thể tự theo dõi và chuyển các thực thể EF cho tất cả các lớp. Hãy chia sẻ suy nghĩ và ý tưởng của bạn. Cảm ơn

Trả lời

0

Tôi sẽ không làm điều đó. Cố gắng giữ cho các lớp độc lập càng tốt. Vì vậy, một thay đổi nhỏ trong lược đồ cơ sở dữ liệu của bạn sẽ không ảnh hưởng đến tất cả các lớp của bạn.

Thực thể có thể được sử dụng cho lớp dữ liệu nhưng không được sử dụng. Nếu có, hãy cung cấp các giao diện được sử dụng và cho phép các thực thể của bạn thực hiện chúng (trên một phần tệp) BL không nên biết các thực thể mà là các giao diện.

+0

Tôi hiểu các khái niệm về khớp nối lỏng lẻo và giữ các lớp độc lập với nhau. Tôi cảm thấy rằng nó được thực hiện dễ dàng hơn sau đó. Nếu các thực thể được tạo ra bởi EF không thể được sử dụng trong các lớp khác, cách tiếp cận tốt hơn là gì? Bạn có thể vui lòng cung cấp một số hướng dẫn rõ ràng .. cảm ơn – samsur

+0

Tôi đã chỉnh sửa câu trả lời của tôi –

0

Tôi nghĩ lớp học một phần sẽ là một ý tưởng hay. Nếu mô hình được tái tạo thì bạn sẽ không làm mất logic nghiệp vụ trong các lớp từng phần.

Thay vào đó, bạn cũng có thể chỉ xem mã EF4 để bạn không cần phải tạo mô hình của mình từ cơ sở dữ liệu.

1

tôi sẽ không làm điều đó, vì những lý do sau đây:

  1. Bạn mất sự phân biệt rõ ràng giữa các lớp dữ liệu và lớp kinh doanh
  2. Nó làm cho các lớp kinh doanh khó khăn hơn để kiểm tra

Tuy nhiên, nếu bạn có một số mã mô hình dữ liệu cụ thể, hãy đặt đó là một phần của lớp để tránh bị mất khi bạn tạo lại mô hình.

+0

Vì vậy, bạn đề xuất cách nào để tạo lớp doanh nghiệp chính xác? Sử dụng mẫu DTO? Sử dụng kho lưu trữ? – samsur

0

Tôi sẽ sử dụng các lớp học một phần. Không có thứ gì như lớp dữ liệu trong mã DDD-ish. Có một tầng dữ liệu và nó nằm trên SQL Server. Mã ứng dụng chỉ nên chứa lớp nghiệp vụ và một số ánh xạ cho phép các đối tượng kinh doanh bền vững trong tầng dữ liệu được đề cập.

Khung thực thể là mã truy cập dữ liệu của bạn, do đó bạn không nên tự xây dựng. Trong hầu hết các trường hợp, lược đồ cơ sở dữ liệu sẽ được sửa đổi bởi vì mô hình đã thay đổi, không phải ngược lại.

Điều đó đang được nói, tôi sẽ không khuyến khích bạn chia sẻ các thực thể của mình trong tất cả các lớp. Tôi coi trọng việc tách lớp UI và miền. Tôi sẽ sử dụng DTO để chuyển dữ liệu vào và ra khỏi miền. Nếu tôi có quyền tự do cần thiết, tôi thậm chí sẽ sử dụng mẫu CQRS để loại bỏ các thực thể ánh xạ tới DTO - tôi chỉ đơn giản tạo một dự án truy cập dữ liệu EF thứ hai có nghĩa là chỉ đọc dữ liệu cho giao diện người dùng. Nó sẽ được xây dựng trên cùng một cơ sở dữ liệu. Bạn đọc dữ liệu thông qua mô hình đọc (thiếu an toàn - không có logic nghiệp vụ), nhưng bạn sửa đổi nó bằng cách phát hành các lệnh được thực thi dựa trên mô hình thực được thực hiện bằng EF và các phương thức từng phần.

Điều này có trả lời câu hỏi của bạn không?

2

Tôi đã xem xét sử dụng các lớp học một phần và thấy rằng việc hiển thị mô hình cơ sở dữ liệu hướng tới lớp UI sẽ bị hạn chế.

Đối với một vài lý do:

  1. Mô hình thực thể tạo ra bao gồm một mô hình đối tượng quan hệ sâu sắc đó, tùy thuộc vào giản đồ của bạn, sẽ được tiếp xúc với các lớp UI (nói người dẫn chương trình của MVP hoặc ViewModel trong MVVM).
  2. Lớp logic nghiệp vụ thường hiển thị các hoạt động mà bạn có thể mã hóa. Nếu bạn thấy một phương thức lưu trên BLL và xem xét các tham số cần thiết để lưu và xem một mô hình yêu cầu xây dựng các thực thể khác (nguyên nhân của mô hình thực thể quan hệ) chỉ để thực hiện lưu, nó không giữ hoạt động đơn giản.
  3. Nếu bạn có một loạt các dịch vụ web thì dữ liệu bổ sung sẽ cần phải được gửi qua để không có lợi ích rõ ràng.
  4. Bạn có thể tạo DTO bất biến hơn cho các thông số hoạt động của bạn thay vì gặp phải các hiệu ứng phụ khiến cho cùng một phiên bản đã được sửa đổi trong một số phần khác của ứng dụng.
  5. Nếu bạn thực hiện TDD và theo dõi YAGNI thì bạn sẽ có cấu trúc được thiết kế đặc biệt cho thao tác bạn đang viết, sẽ dễ dàng hơn trong việc xây dựng các bài kiểm tra (không yêu cầu tạo các đối tượng khác họ đang ở trên mô hình). Trong trường hợp này bạn có thể có ...

    public class Order 
    { ... 
        public Guid CustomerID { get; set; } 
    ... } 
    

Thay vì sử dụng các mô hình Entity tạo ra bởi các EF có tài liệu tham khảo tiếp xúc ...

public class Order 
{ ... 
    public Customer Customer { get; set; } 
... } 

Bằng cách này, id của khách hàng chỉ cần cho một hoạt động có một đơn đặt hàng. Tại sao bạn cần phải xây dựng một Customer (và các đối tượng tiềm năng khác) cho một hoạt động liên quan đến việc nhận đơn đặt hàng?

Nếu bạn đang lo lắng về việc sao chép và lập bản đồ, sau đó có một cái nhìn tại Automapper

Các vấn đề liên quan