2013-08-07 30 views
11

Trước hết tôi muốn làm rõ rằng tôi mới sử dụng Domain Driven Design và tôi đang đặt câu hỏi này bởi vì tôi đã đọc một cái gì đó gọi là Mô hình Miền Anemic.Mô hình Kho lưu trữ với Thiết kế Điều khiển Tên miền có trở thành Chống Mẫu không?

Hầu hết thời gian tôi nhìn thấy điều sau khi làm việc với mẫu Kho lưu trữ.

  1. Chúng tôi đã Một Generic Repository
  2. Chúng tôi có mẫu mà chỉ chứa một tập hợp các tài sản công cộng nhưng nó không chứa bất kỳ phương pháp (Vì vậy, Nó trở nên thiếu máu Domain Model theo định nghĩa của DDD) vì lớp ở đây kho xử lý khác quy trình cho thực thể hoặc mô hình đó.

Vui lòng cung cấp câu trả lời có giá trị cho truy vấn của tôi.

Hãy để tôi làm rõ một số điều.

Kho lưu trữ chung có nghĩa là giao diện chung được triển khai bởi kho lưu trữ Entity.

nhầm lẫn của tôi là về sau điều

Ví dụ: Giả sử tôi muốn lưu

public class User 
    { 
     public int Id { get; set;} 
     public string Name { get; set}; 
    } 

    public class UserRepository : IRepository<User> 
    { 
     // All Operation Like Save/Get/UserEntity (Domain Object)  
    } 

Vì vậy, đây là lớp người dùng của tôi không làm gì thay vào đó nó chỉ có tài sản và xử lý hoạt động khác bằng cách UserRespository. Vì vậy, người dùng của tôi là mô hình Miền thiếu máu. (Vì nó không có gì cụ thể)

Ở đây trong hình ảnh đính kèm, tôi xem xét ProductRepository vì vậy câu hỏi của tôi là: Sản phẩm của tôi có phải là mô hình Anemic không?

Vui lòng xem xét làm theo Mẫu hình ảnh cho những gì tôi đang cố gắng nói.

enter image description here

+0

Bạn có thể giải thích thêm không? Điều gì làm cho bạn nghĩ rằng Repository sẽ là một antipattern? Ý kiến ​​của ai đó? Của riêng bạn? Đặt một số giá trị vào câu hỏi nếu bạn mong đợi câu trả lời có giá trị :) –

+0

Nó không phải là của riêng tôi mà Repository là mô hình chống nhưng tôi nhầm lẫn cách định nghĩa mô hình miền lưu trữ và mô hình kho lưu trữ. Giống như mô hình Repository chăm sóc lưu thực thể nhưng thực thể chính nó không có bất kỳ phương pháp nào để lưu. – dotnetstep

+0

Điều đó sẽ hoàn toàn hợp lệ trong DDD, coi các kho lưu trữ là dịch vụ. –

Trả lời

15

Các mô hình kho không phải là một mô hình chống cho mỗi gia nhập, nhưng tôi đã thấy xa để việc triển khai nhiều của DDD nơi mô hình kho cung cấp ít hoặc không có giá trị. Bàn tay kiến ​​trúc lớp n-tier-cung cấp-không-giá trị của bạn cho một dev chuyên gia thực dụng hardcore và ông có lẽ sẽ cung cấp cho bạn các "chống mẫu" phê bình (và hợp lệ tôi có thể nói).

Repository mẫu chuyên nghiệp:

  1. Một trừu tượng của công nghệ bền bỉ tiềm ẩn
  2. Một khả năng để xác định nguồn gốc tổng hợp của bạn, chỉ có nguồn gốc tổng hợp nên có kho
  3. Một cách nêu một cách rõ ràng mà các hoạt động có giá trị đối với tổng hợp gốc được đề cập, ví dụ: nếu không hợp lệ để xóa đối tượng của bạn, kho lưu trữ của bạn sẽ không có phương thức xóa.
  4. Cái gì đó rất dễ dàng để kiểm tra mà không có một cơ sở dữ liệu (stubbing kho của bạn)

Repository mẫu khuyết điểm:

  1. Gần gũi với công nghệ kiên trì của bạn.
  2. Yet-một tầng

Cá nhân tôi thích sử dụng mô hình kho khi làm DDD, nhưng giải pháp của bạn nghe có vẻ giống như mô hình kỷ lục hoạt động, do đó loại bỏ hầu hết các lợi ích của việc sử dụng kho dữ liệu ở nơi đầu tiên. Tôi không bao giờ làm kho chung vì họ loại bỏ ưu 2 & 3 (Tôi có thể có một thực hiện chung chung, nhưng tôi không tiếp xúc trực tiếp với mã người tiêu dùng kho lưu trữ).

Và cũng: không sử dụng kho lưu trữ cho dân số DTO, ViewModels, v.v. Sử dụng các mô hình và công nghệ riêng biệt để viết mô hình (DDD có thể hoạt động tốt) và đọc.

20

Tôi đồng ý rằng giao diện IRepository thường mất thời gian. Nếu tôi đặt các hoạt động CRUD cơ bản trong giao diện IRepository của mình, thì làm cách nào để xử lý dữ liệu như dữ liệu kiểm toán? Trường hợp xóa nó sẽ bị cấm. Tôi có nên trả lại số InvalidOperationException khi tôi cố gọi số Delete() không?

Một số người đã đề xuất các giao diện nhỏ hơn như IReadable, IWriteable, IUpdateable hoặc IDeleteable. Tôi nghĩ rằng cách tiếp cận này thậm chí còn lộn xộn hơn.

Cá nhân (và đây chỉ là giải pháp của riêng tôi sau khi cho mọi thứ khác chạy xung quanh khối), cho DDD, tôi thích sử dụng giao diện cho mỗi kho lưu trữ (chủ yếu cho IoC và thử nghiệm đơn vị). Điều này mang lại cho tôi IUserRepository, IAuditLogRepository, v.v. Các kho lưu trữ của tôi cũng lấy (như các tham số) và trả về các thực thể tên miền (rễ tổng hợp hoặc chỉ các thực thể đơn lẻ). Bằng cách này không có các đối tượng DTO thiếu máu để duy trì hoặc làm lộn xộn giải pháp của tôi. Tuy nhiên, tôi vẫn sử dụng chế độ xem để giữ dữ liệu nhạy cảm khỏi tầm nhìn của tôi.

Có nhiều đối số trực tuyến và chống lại mẫu lưu trữ.

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