2013-06-01 19 views
5

Tôi đã đọc các bài viết về StackOverflow và các trang web khác cả ngày về thực tiễn kiến ​​trúc tốt nhất và có quá nhiều ý tưởng và ý kiến ​​trái ngược nhau.Nếu Entity Framework/DbContext là DAL/Repository, nó phù hợp với kiến ​​trúc 3 tầng ở đâu?

Cuối cùng tôi đã giải quyết một cách tiếp cận, nhưng tôi đang có một thời gian thực sự khó khăn quyết định nơi để đặt các đối tượng EF (DbContext, Fluent API, dữ liệu Seeding, vv). Dưới đây là những gì tôi hiện có:

Dự án ASP.NET MVC: Dự án web thực tế. Chứa các chế độ xem chuẩn, bộ điều khiển và Chế độ xem mô hình (bên trong một mô hình Mô hình).

Dự án mẫu miền: Chứa tất cả các lớp POCO xác định đối tượng cơ sở dữ liệu (tên miền). Hiện tại, không đề cập đến hoặc tham khảo bất kỳ đối tượng EF nào.

Dự án lớp dịch vụ: Chứa các đối tượng dịch vụ cho từng loại đối tượng miền (ví dụ: IProductService, IOrderService, v.v ...). Mỗi dịch vụ tham chiếu đến các đối tượng EF như DbSets và xử lý các quy tắc kinh doanh - ví dụ: thêm Sản phẩm, tìm Sản phẩm, thêm Sản phẩm vào Đơn hàng, v.v.

Câu hỏi đặt ra là ở đâu? Ban đầu tôi nghĩ trong Lớp dịch vụ, nhưng điều đó dường như không có ý nghĩa. Sau đó tôi nghĩ rằng để đặt chúng trong Lớp Mô hình Miền, nhưng sau đó nó liên kết Mô hình Miền với EF, về bản chất là một DAL/Repository. Cuối cùng, tôi nghĩ về việc tạo ra một dự án DAL riêng cho EF, nhưng nó có vẻ như một sự lãng phí rất lớn khi xem xét nó có khả năng sẽ có 3-4 tệp trong đó (DbContext và một vài tệp nhỏ khác).

Có ai có thể cung cấp bất kỳ hướng dẫn nào không?

+0

Điều gì đang thúc đẩy bạn tạo ba dự án thay vì chỉ một dự án? –

+0

Khả năng mở rộng tốt hơn. Với một dự án riêng biệt cho các mô hình miền và một cho các dịch vụ, bạn có thể có một ứng dụng khác (ví dụ, một ứng dụng WinForms) có thể dễ dàng tiêu thụ miền và logic nghiệp vụ mà không cần phải sao chép mã. Ngoài ra, nếu có ứng dụng WinForms và ứng dụng MVC, những thứ như thay đổi quy tắc kinh doanh chỉ cần được thực hiện ở một nơi thay vì hai. – Amberite

Trả lời

3

Không cần mô hình miền vì nó sẽ là dự phòng. Các lớp EF trực tiếp có thể hoạt động như Mô hình miền và chúng được chuyển đổi thành Kiểu xem trong khi gửi đến Chế độ xem. EF có thể được chia thành các thư viện lớp khác nhau. Hầu hết trong số họ sử dụng mẫu kho lưu trữ cùng với bất kỳ trường hợp ORM nào sẽ dễ dàng nếu chúng thay thế. Nhưng tôi đã nhìn thấy những lời chỉ trích về việc sử dụng mẫu kho lưu trữ, hãy kiểm tra this.

+0

Tôi đang sử dụng mã EF đầu tiên, vì vậy tôi tự mình tạo các lớp POCO. Tuy nhiên, tôi đã có ấn tượng rằng Mô hình Tên miền của tôi phải là các lớp học POCO thuần túy và EF DbContext et al nên sống ở nơi khác. Điều này có sai không? – Amberite

+0

Giống như Sunny được nhắc đến - tham gia các lớp POCO của bạn và tạo một dự án mới trong giải pháp của bạn mà chỉ chứa các lớp POCO của bạn (không phải DbContext) của bạn .. assembly có thể rất nhẹ và không cần phụ thuộc vào EF. DbContext của bạn sẽ nằm trong WPF/WinForm/WebForm/MVC/Silverlight/Whatever-assembly của bạn sẽ phụ thuộc vào EF. Đó là cách tiếp cận tốt nhất và cách bạn thường thấy Microsoft chứng minh khi hiển thị mã EF trước. –

+0

@DerekCurtis: Vấn đề là nếu tôi đặt DbContext trong dự án MVC, thì Lớp Dịch vụ cần tham chiếu đến dự án MVC và dự án MVC cũng cần tham chiếu đến Lớp Dịch vụ. Có vẻ như một tham chiếu vòng tròn? – Amberite

3

Dưới đây là những gì tôi làm:

dữ liệu:

  • Có một lớp kế thừa từ DbContext.
    • Nó có tất cả các bộ db.
    • Ghi đè OnModelCreating.
    • Lập bản đồ các khóa và mối quan hệ chính.

Đối tượng:

  • Có mỗi lớp POCO.
    • Mỗi thuộc tính được trang trí bằng chú thích dữ liệu cần thiết.

dịch vụ:

  • Mỗi dịch vụ có phương pháp phổ biến (GetList(), Tìm(), Tạo(), vv).

kinh doanh:

  • gọi từ khách hàng, orchestrate sử dụng dịch vụ để thực hiện một nhiệm vụ cụ thể UserChangePassword (điều này sẽ kiểm tra nếu điều này có thể được thực hiện, sau đó thực hiện nhiệm vụ, hoặc trả lại lỗi/trạng thái trái phép trong số nhiều những người khác để làm cho khách hàng thấy thông tin chính xác liên quan đến nhiệm vụ. này vào trường hợp của tôi là nơi tôi đăng nhập.

Clients (Desktop/Web/WPF/etc).

Tôi không nói đây là cách tiếp cận tốt nhất, tôi chỉ chia sẻ những gì đang làm việc cho tôi.

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