Khung thực thể và tránh Mô hình miền thiếu máu


11

Trong logic kinh doanh của chúng tôi, đôi khi chúng tôi có các phương thức được định nghĩa như thế này:

User.ResetCourse(Course courseToReset)

Vấn đề là cả Người dùng và Khóa học đều là các đối tượng proxy Entity Framework. Điều này có nghĩa là khi chúng ta nhấn các thuộc tính điều hướng trên Người dùng hoặc Khóa học, nó có thể gây ra một cú hích lớn cho cơ sở dữ liệu vì các đối tượng đó không phải là IQueryable nên nó lặp đi lặp lại thông thường.

Để giải quyết điều này, chúng tôi đã thay đổi chữ ký thành:

User.ResetCourse(MyDBContext db, Course courseToReset)

Điều này có nghĩa là chúng ta có thể truy vấn trực tiếp cơ sở dữ liệu để thực hiện các thay đổi mà chúng ta cần một cách hiệu quả nhưng việc chuyển ngữ cảnh Cơ sở dữ liệu đến một đối tượng kinh doanh có vẻ rất sai.

Sau đó chúng tôi đã chuyển sang người dùng một lớp dịch vụ, điều đó có nghĩa là chúng tôi có một cái gì đó như:

CourseService.ResetForUser(Course courseToReset, User forUser)

Dịch vụ này có tham chiếu đến DBContext được đưa vào khi tạo nhưng bây giờ các đối tượng kinh doanh của chúng tôi chỉ là các túi dữ liệu không có hành vi (ví dụ: Mô hình miền thiếu máu).

Làm thế nào chúng ta có thể tránh điều này?


11
Một loại âm thanh giống như bạn vừa nhận ra rằng các mô hình khung thực thể thực sự là DTO và hoàn toàn không phải là một mô hình miền. Bạn thực sự đang cố gắng làm DDD? Nếu không, nó có lẽ không thành vấn đề.
Ông Cochese

3
Các dịch vụ ADM plus là một kiến ​​trúc tốt cho nhiều thứ
Ewan


2
@JohnWu đó là một bài viết rất thiên vị. Thật vậy, nó chứa phiên bản "Strawman" của một mô hình miền phong phú, bằng cách đưa mẫu Active Record vào ví dụ phong phú. Chắc chắn, Active Record không được sử dụng trong DDD và nói chung là một lựa chọn kém cho bất kỳ ứng dụng phức tạp nào.
RibaldEddie

Câu trả lời:


7

Vấn đề là, bạn đang sử dụng các đối tượng EF làm đối tượng miền ở vị trí đầu tiên. Đối tượng EF là mô hình dữ liệu KHÔNG phải mô hình kinh doanh.

Bạn cần khai báo các đối tượng kinh doanh cho phép bạn tự do làm những gì bạn cần, sau đó lấy và lưu trữ chúng với một kho lưu trữ. Kho lưu trữ của bạn sẽ ánh xạ các thực thể EF đến các thực thể kinh doanh của bạn. Các đối tượng EF không bao giờ nên được sử dụng bên ngoài kho lưu trữ của bạn.


0

Bạn có thể tránh nó bằng cách làm một cái gì đó như:

CourseService.prepareForUserCourseReset(DBContext db);
User.reset();
Course.reset();
CourseService.completeUserCourseReset(DBContext db);

Hoặc một cái gì đó cho hiệu ứng đó, dù sao, nếu bạn bắt được sự trôi dạt của tôi. Nghe có vẻ như cách tiếp cận mà bạn có với cách ban đầu mà bạn mô tả là liên quan đến hiệu suất và không nhất thiết liên quan đến cấu trúc của tên miền. Vì vậy, thực sự bạn nên xem xét giải quyết vấn đề hiệu suất trong lớp dịch vụ nhưng có thể giữ hành vi trong miền. Sẽ rất hữu ích khi biết ý nghĩa của việc đặt lại Người dùng / Khóa học trong ngữ cảnh này cũng như nếu bạn muốn có câu trả lời tốt hơn.


-1

Theo truyền thống, điều này được giải quyết bằng cách sử dụng chiến lược tìm nạp cho từng trường hợp sử dụng, hướng dẫn Entity Framework háo hức tải các liên kết cần thiết trên truy vấn ban đầu bằng IQueryable.Include ().

Udi Dahan đã viết một bài đăng mô tả cách tiếp cận chung, có thể được điều chỉnh theo Entity Framework.

http://udidahan.com/2007/09/16/fetching-strargety-nhibernate-im THỰCation-av Available /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.