2008-11-27 36 views
5

Câu hỏi nhanh: Sẽ là một ý tưởng hay hay để triển khai kho lưu trữ kiểu thiết kế theo miền của tôi với tư cách là người độc thân? Tại sao?Các kho lưu trữ DDD là đơn?

Hoặc tôi có nên sử dụng thùng chứa bộ phận phụ thuộc để quản lý kho lưu trữ của mình và quyết định xem chúng có phải là người độc thân hay không?

Tôi vẫn đang đọc DDD Nhanh chóng và muốn xem một số ví dụ về kho lưu trữ tốt.

Trả lời

2

Tôi đã xem một số cách để thực hiện việc này.

Cách phổ biến nhất là sử dụng tiêm phụ thuộc để tiêm các kho lưu trữ vào các đối tượng sử dụng chúng. Thông thường đây là những người trình bày hoặc các lớp điều khiển nhưng trong một số trường hợp, mô hình gọi vào kho lưu trữ. Thường thì tốt hơn nếu bạn tránh điều này. Nếu bạn có thể sử dụng một di-container để làm điều này sau đó đi cho nó.

Bạn cũng có thể làm cho kho lưu trữ triển khai mẫu đơn. Tôi sẽ cố gắng tránh điều này bởi vì các singleton thường sử dụng các phương thức tĩnh. Điều này có thể làm cho việc kiểm tra mã gọi vào những người độc thân khó khăn hơn. Nếu bạn phải làm những điều theo cách này thì hãy chắc chắn rằng bạn tách ra mã gọi singleton và sử dụng "phụ thuộc" tiêm phụ thuộc để tiêm các singletons vào các lớp học gọi chúng. Điều này được loại bỏ một số các khớp nối chặt chẽ bạn nếu không có được.

Tôi đã xem một số ví dụ về nơi lưu trữ không bao giờ được gọi. Khi ai đó điều hướng biểu đồ đối tượng trong mô hình và yêu cầu một đối tượng không được tải mô hình, hãy tăng sự kiện và kho lưu trữ phản ứng với sự kiện này. Bằng cách này không có cuộc gọi vào kho lưu trữ và nó hoàn toàn tách rời khỏi mô hình. Tôi không tự mình sử dụng kiến ​​trúc này nhưng nó có vẻ rất sạch sẽ.

+0

Tôi thấy tải trọng lười biếng thông qua khái niệm sự kiện mà bạn đã đề cập thú vị, bạn có thể chỉ cho tôi bất kỳ tài liệu hoặc ví dụ nào mà bạn có thể biết rằng có thể đang sử dụng chiến lược đó không? Tôi muốn đánh giá nó để sử dụng riêng của tôi. – jpierson

+1

@jpierson Tôi đã tìm kiếm nhưng không thể tìm thấy bất kỳ ví dụ nào. Tôi nhớ một người nào đó giới thiệu cách tiếp cận sự kiện trong một cuộc nói chuyện trên DDD nhưng thành thật mà nói, điều này hoàn toàn là lý thuyết. – Mendelt

3

Sử dụng vùng chứa tiêm phụ thuộc của bạn để quyết định cách tạo và vị trí lưu trữ.

Bằng cách sử dụng

UserRepository.Instance.Find(userId); 

bạn đang tạo ra một rào cản đối với thử nghiệm.

Nếu kho lưu trữ của bạn được chuyển vào các dịch vụ bằng cách sử dụng Constructor Injection, thì bạn cũng có thể dễ dàng thay thế chúng bằng mocks.

0

Tôi không chắc chắn về điều này và tôi có cùng một vấn đề. Tôi nghĩ rằng bạn nên làm cho một kho lưu trữ một singleton khi các đối tượng mà nó làm việc với được sử dụng thường xuyên. Và nó không nên được tạo ra một singleton nếu bạn sử dụng các đối tượng mà nó hoạt động với hiếm khi, vì kho lưu trữ sẽ mất rất nhiều bộ nhớ cho các đối tượng và có thể nó sẽ chỉ được gọi một lần và không bao giờ trở lại trong quá trình sử dụng ứng dụng. Như tôi đã nói, đây có thể không phải là suy nghĩ chính xác.

+0

Với một kho không phải là singleton, nó vẫn có thể chia sẻ trạng thái bên trong với các trường hợp khác của cùng một kho lưu trữ đó thông qua việc sử dụng trạng thái nội bộ tĩnh hoặc thông qua một mẫu trạng thái chia sẻ chẳng hạn như mẫu NWorkspace. – jpierson

0

Cho phép nói rằng tôi có dự án thực sự rất lớn và tôi muốn thêm dịch vụ mới cho phép nói rằng đó sẽ là đại diện phần cứng trong hệ thống của tôi. Tôi muốn dịch vụ này có thể truy cập được qua nhiều lớp, tôi muốn chắc chắn rằng chỉ có một thể hiện của dịch vụ hoặc lớp kiểm soát quyền truy cập vào dịch vụ. Tiêm dịch vụ này thông qua tất cả hệ thống của tôi (hơn 200 lớp) sẽ có nhiều công việc. Đối với tôi "Singleton" hoặc một số "Dịch vụ định vị" phù hợp tốt cho nhiệm vụ này.

0

Theo tôi hiểu miền chỉ chứa một giao diện kho lưu trữ, có nghĩa là có thể có nhiều triển khai kho lưu trữ cho một giao diện duy nhất. Vì vậy, một kho lưu trữ chắc chắn không thể là một lớp tĩnh, vì bạn không thể định nghĩa các phương thức tĩnh trong một giao diện. (Lưu ý: Trong một số ngôn ngữ, bạn có thể định nghĩa các phương thức tĩnh trong một giao diện, nhưng nó không có ý nghĩa nhiều với tôi.)

Kho thường là về đồng bộ hóa các thực thể với cơ sở dữ liệu, tệp, v.v. để chúng có các phụ thuộc không ổn định. Điều đó có nghĩa là họ không thể là những người độc thân có thể chỉ có những phụ thuộc môi trường xung quanh. Đây là một số article về nó. Phần buồn cười ngay cả các tác giả cũng cho bạn biết rằng bạn có thể sử dụng các tệp đơn trong miền của bạn.

Để hiểu biết của tôi, nó sạch hơn nhiều để tạo một kho lưu trữ đảm bảo rằng bạn chỉ có một thực thể duy nhất thay vì nhiều thực thể. Đó là tính linh hoạt của kho lưu trữ, không phải là thực thể nếu bạn muốn mã của bạn đáp ứng được single responsibility principle.

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