6

Lớp nào trong dự án của tôi phải chịu trách nhiệm theo dõi các Gốc tổng hợp nào đã được tạo ra để không tạo hai phiên bản cho cùng một thực thể. Kho chứa của tôi có nên giữ một danh sách tất cả các tập hợp mà nó đã tạo không? Nếu có, làm thế nào để tôi làm điều đó? Tôi có sử dụng kho lưu trữ đơn (không đúng với tôi) không? Có một tùy chọn khác để đóng gói bộ nhớ đệm này ở một nơi khác là một số lớp khác không? Lớp này sẽ trông như thế nào và nó sẽ phù hợp với kiểu gì?Làm cách nào để triển khai Kho lưu trữ (DDD) của tôi trong C# để xử lý nhiều cuộc gọi cho cùng một Tổng hợp Gốc

Tôi không sử dụng công cụ lập bản đồ O/R, vì vậy nếu có công nghệ xử lý nó, tôi cần phải biết nó hoạt động như thế nào (có sử dụng mẫu nào) để có thể sử dụng it

Cảm ơn!

Trả lời

3

Tôi tin rằng bạn đang suy nghĩ về mẫu Bản đồ nhận dạng, as described by Martin Fowler.

Trong mô tả đầy đủ về mô hình (trong cuốn sách của mình), Fowler thảo luận các mối quan tâm thực hiện cho các thực thể đọc/ghi (những người tham gia giao dịch) và chỉ đọc (dữ liệu tham khảo, lý tưởng chỉ nên đọc một lần và sau đó) được lưu trữ trong bộ nhớ).

Tôi khuyên bạn nên lấy cuốn sách tuyệt vời của mình, nhưng đoạn trích mô tả mẫu này có thể đọc được trên Google Sách (tìm kiếm "bản đồ nhận dạng cá mập").

Về cơ bản, một bản đồ nhận dạng là một đối tượng lưu trữ, ví dụ như trong một hashtable, các đối tượng thực thể được tải từ cơ sở dữ liệu. Bản thân bản đồ được lưu trữ trong ngữ cảnh của phiên hiện tại (yêu cầu), tốt nhất là trong một Đơn vị Làm việc (đối với các thực thể đọc/ghi). Đối với các thực thể chỉ đọc, bản đồ không cần phải gắn với phiên và có thể được lưu trữ trong ngữ cảnh của quá trình (trạng thái toàn cục).

+0

Tôi sở hữu cuốn sách đó. Tôi sẽ xem bản đồ Identity để xem nó có phù hợp không. Cảm ơn – Mark

1

Tôi xem xét việc lưu vào bộ nhớ cache là điều gì đó xảy ra ở cấp Dịch vụ, thay vì trong kho lưu trữ. Các kho lưu trữ phải là "câm" và chỉ thực hiện các hoạt động CRUD cơ bản. Các dịch vụ có thể đủ thông minh để làm việc với bộ nhớ đệm khi cần thiết (có thể là quy tắc kinh doanh nhiều hơn quy tắc truy cập dữ liệu cấp thấp).

Để đơn giản, tôi không cho phép bất kỳ mã nào sử dụng Kho lưu trữ trực tiếp - chỉ các Dịch vụ mới có thể thực hiện điều đó. Sau đó mọi thứ khác tiêu thụ các dịch vụ có liên quan dưới dạng giao diện. Điều đó mang lại cho bạn một wrapper tốt đẹp để đưa vào logic biz, bộ nhớ đệm, vv

+0

Vì vậy, nếu hai cuộc gọi cho cùng một Tổng hợp được thực hiện cho cùng một ví dụ của kho lưu trữ, hai trường hợp riêng biệt của cùng một Tổng hợp sẽ được tạo và trả về? – Mark

+0

Có, nhưng các cuộc gọi đó sẽ được thực hiện thông qua Dịch vụ sẽ lưu vào bộ nhớ tổng hợp nếu cần. Vì vậy, trong trường hợp đó, Dịch vụ sẽ chỉ gọi đến kho lưu trữ một lần và chỉ trở về từ bộ nhớ cache theo yêu cầu thứ hai. –

+0

nhưng cũng thấy câu hỏi này - http://stackoverflow.com/questions/3442102/repository-pattern-caching - một số người có ý kiến ​​khác. Tôi thích điều trị bộ nhớ đệm như là một hình thức quan tâm kinh doanh để kho của tôi có rất ít phụ thuộc, nhưng không phải ai cũng xem nó theo cách đó. –

0

Tôi sẽ nói, nếu điều này "bộ nhớ đệm" quản lý bất cứ nơi nào khác hơn Kho lưu trữ thì bạn đang để cho mối quan tâm rò rỉ ra ngoài.

Kho lưu trữ là tập hợp các mục của bạn. Không có mã tiêu thụ kho lưu trữ phải có quyết định có nên lấy đối tượng từ kho lưu trữ hoặc từ một nơi khác.

Âm thanh Singleton như đời sai; nó có thể sẽ là theo yêu cầu. Điều này rất dễ quản lý nếu bạn đang sử dụng một thùng chứa IoC/DI.

Dường như thực tế là bạn thậm chí đã cân nhắc nhiều cuộc gọi cho cùng một bằng chứng chứng minh một vấn đề kiến ​​trúc/thiết kế. Tôi sẽ quan tâm để nghe một ví dụ về những gì những cuộc gọi đầu tiên và thứ hai có thể được, và tại sao họ yêu cầu cùng một ví dụ chính xác của AR của bạn.

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