12

Tôi đang cố gắng tìm ra lớp nào chịu trách nhiệm về việc lưu vào bộ nhớ đệm (chèn/xóa) hoạt động trong một dự án Thiết kế Driven Miền. Mục đích là để cải thiện hiệu suất của ứng dụng web bằng cách lưu trữ bất kỳ thực thể nào được lấy ra từ kho lưu trữ.Đang lưu vào bộ nhớ cache một kho lưu trữ, tên miền hoặc ứng dụng liên quan?

Giải pháp của tôi được tách ra như sau:

MyApp.Infrastracture 
MyApp.Repositories 
MyApp.Domain 
MyApp.WebApplication 

tôi cảm thấy rằng kể từ khi nó chỉ ứng dụng Web mà sử dụng bộ nhớ cache sau đó nó nên được lớp này mà logic bộ nhớ đệm nên đi đâu? Tuy nhiên điều này không cảm thấy chính xác vì tôi muốn giữ cho ứng dụng web nhẹ và tập trung vào việc phục vụ các trang web.

Ngoài ra bộ nhớ đệm không phải là khái niệm miền hạng nhất nên không có sự phù hợp tự nhiên trong lớp Miền.

Việc cần làm?

+4

Đó là mối quan ngại của tất cả những điều trên. Caching là một trong những mối quan tâm cắt chéo mà mỗi lớp cần xử lý riêng lẻ và ứng dụng cần phối hợp. – Oded

+0

@Oded - bạn nên đặt câu trả lời đó là một câu trả lời –

+1

@David Kemp - done ... – Oded

Trả lời

11

Đó là mối quan tâm của tất cả những điều trên.

Caching là một trong những mối quan tâm cắt chéo mà mỗi lớp cần xử lý riêng lẻ và ứng dụng cần phối hợp.

+1

Cảm ơn tôi nghĩ rằng bạn đã đóng đinh nó cho tôi khi đề cập rằng Ứng dụng web là dàn nhạc. – Fixer

4

Tôi hoàn toàn đồng ý với Oded rằng đó là mối quan tâm cắt chéo, nhưng nó cũng phải minh bạch cho khách hàng của các mục được lưu trong bộ nhớ cache.

Ví dụ: người dùng kho lưu trữ của bạn không quan tâm liệu một mục có được lưu trong bộ nhớ cache hay không.

Tôi cho rằng nếu bộ nhớ đệm là một khía cạnh quan trọng trong giải pháp của bạn thì nó sẽ được làm rõ trong miền, tuy nhiên, bạn có thể thấy rằng nó thực sự kết thúc như một phần của cơ sở hạ tầng và được phân phối (âm thầm) qua bất kỳ container IoC nào bạn sử dụng.

0

Bộ nhớ đệm có thể được phân phối giữa các lớp, đôi khi bộ nhớ đệm có thể được tự động đạt được trong lớp miền nếu bạn đang sử dụng ORM như Nhibernate hỗ trợ bộ đệm của nhiều cấp. Trong các lớp trên nó có thể dựa trên yêu cầu, ví dụ khi tải người dùng hệ thống tải những gì người sử dụng chức năng được phép làm, sau đó nó có thể được lưu trữ trong cấp ứng dụng. Vì vậy, tất cả phụ thuộc vào ứng dụng.

5

Bạn lưu ý

Mục đích là để cải thiện hiệu suất của các ứng dụng Web của bộ nhớ đệm bất kỳ thực thể được lấy ra từ kho.

Vì vậy, tôi nghĩ bạn nên triển khai nó một cách minh bạch trong kho lưu trữ của mình. Kho lưu trữ có nghĩa là để ẩn các chi tiết về sự kiên trì từ miền và nếu bạn muốn lưu trữ các đối tượng lớn để thực hiện, thì tên miền sẽ không có gì khôn ngoan hơn. Kho lưu trữ của bạn sẽ phải thông minh hơn một chút, có khả năng theo dõi nhiều bản sao của cùng một đối tượng như các chủ đề song song yêu cầu các đối tượng và đồng thời biến đổi chúng. Hoặc - nếu có thể - nối tiếp truy cập vào các gốc tổng hợp riêng lẻ khi chúng đại diện cho các ranh giới giao dịch.

Như @Oded đã chỉ ra, bộ nhớ đệm thực sự có thể xảy ra ở bất kỳ nơi nào và bạn có thể thấy mình đang triển khai ở nhiều nơi nếu hiệu suất là vấn đề và mỗi điểm có thể làm khác. Ví dụ: bạn có thể lưu vào bộ nhớ cache kết quả của một số truy vấn nhất định trong miền của mình hoặc bạn có thể lưu toàn bộ phản hồi HTML.

Sự phối hợp nhiều lớp xuất hiện vì bộ đệm có thể là một sự trừu tượng bị rò rỉ. Nếu các đối tượng miền của bạn được lưu trong bộ nhớ cache, khi nào chúng phải được tách ra? Điều gì sẽ xảy ra nếu một chủ đề đang sử dụng một đối tượng được lưu trong bộ nhớ cache và một chủ đề khác thì không? Điều gì sẽ xảy ra nếu bạn đang lưu vào bộ nhớ cache kết quả truy vấn, nhưng các đối tượng bên dưới đã thay đổi? Khi vô hiệu và làm thế nào để vô hiệu hóa những câu hỏi khó, cả từ quan điểm cơ sở hạ tầng và quan điểm kinh doanh. Truy vấn cũ không phải lúc nào cũng xấu.

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