2010-04-08 23 views
8

Tôi đang trong quá trình khởi động dự án mới và tạo đối tượng kinh doanh và truy cập dữ liệu, v.v. Tôi chỉ sử dụng các đối tượng clr cũ chứ không phải bất kỳ orms nào. Tôi đã tạo hai thư viện lớp: 1) Đối tượng kinh doanh - giữ tất cả các đối tượng kinh doanh của tôi, tất cả các đối tượng này có trọng lượng nhẹ chỉ với các thuộc tính và quy tắc kinh doanh. 2) Kho lưu trữ - đây là tất cả quyền truy cập dữ liệu của tôi.Mẫu lưu trữ với tải lazying bằng POCO

Đa số các đối tượng của tôi sẽ có danh sách trẻ em và câu hỏi của tôi là cách tốt nhất để tải các giá trị này xuống vì tôi không muốn mang lại thông tin không cần thiết nếu tôi không cần.

Tôi đã nghĩ đến khi sử dụng "get" trên thuộc tính con để kiểm tra xem "null" của nó và nếu nó được gọi là kho của tôi để lấy thông tin về con. Điều này có hai vấn đề từ những gì tôi có thể thấy: 1) Các đối tượng "biết" làm thế nào để có được bản thân tôi thay vì sẽ không có logic truy cập dữ liệu được tổ chức trong đối tượng. 2) Điều này yêu cầu cả hai lớp tham chiếu lẫn nhau trong phòng thu trực quan đều có lỗi phụ thuộc vòng tròn.

Có ai có bất kỳ đề xuất nào về cách khắc phục sự cố này hoặc bất kỳ đề xuất nào về bố cục dự án của tôi và nơi nó có thể được cải thiện không?

Cảm ơn

Trả lời

2

Sau khi xem xét các câu trả lời được cung cấp và nghiên cứu sâu hơn, tôi đã tìm thấy một bài viết sử dụng các đại biểu cho tải chậm. Điều này cung cấp một giải pháp đơn giản hơn bằng cách sử dụng proxy hoặc thực hiện NHibernate.

Đây là link cho bài viết.

0

Bạn có thể khắc phục vấn đề phụ thuộc chu trình nếu mã tải lười biếng của bạn tải kho tại thời gian chạy (Activator.CreateInstance hoặc một cái gì đó tương tự) và sau đó gọi phương thức thích hợp thông qua phản ánh. Tất nhiên có những hình phạt hiệu suất liên quan đến sự phản ánh, nhưng thường hóa ra là không đáng kể trong hầu hết các giải pháp. Một cách khác để giải quyết vấn đề này đơn giản là biên dịch thành một dll duy nhất - ở đây bạn vẫn có thể phân tách một cách hợp lý các lớp bằng cách sử dụng các không gian tên khác nhau, và vẫn tổ chức các lớp của bạn bằng cách sử dụng các thư mục khác nhau.

3

Để làm điều này yêu cầu bạn lập trình để giao diện (trừu tượng hóa trên triển khai) và/hoặc khai báo thuộc tính của bạn ảo. Sau đó, kho lưu trữ của bạn trả về một đối tượng proxy cho các thuộc tính được nạp lazily. Lớp gọi các kho lưu trữ là không có gì khôn ngoan hơn, nhưng khi nó cố gắng truy cập vào một trong các thuộc tính đó, proxy gọi cơ sở dữ liệu và nạp các giá trị lên.

Thành thật mà nói, tôi nghĩ rằng đó là sự điên rồ để cố gắng thực hiện điều này. Có những giải pháp tuyệt vời, được thử nghiệm thời gian cho vấn đề này ngoài kia, đã được phát triển và tinh chỉnh bởi những tâm trí vĩ đại nhất trong .NET.

Để thực hiện proxy, bạn có thể sử dụng Castle DynamicProxy hoặc bạn có thể sử dụng NHibernate và để cho nó xử lý tất cả proxy và tải chậm cho bạn (nó sử dụng DynamicProxy). Bạn sẽ nhận được hiệu suất tốt hơn so với bất kỳ triển khai nào được thực hiện bằng tay, được đảm bảo.

NHibernate sẽ không gây rối với POCO của bạn - không có thuộc tính, không có lớp cơ sở; bạn chỉ cần đánh dấu các thành viên ảo để cho phép tạo proxy.

Nói một cách đơn giản, tôi sẽ xem xét lại bằng cách sử dụng ORM, đặc biệt nếu bạn muốn tải chậm; bạn không phải từ bỏ các POCO của mình.

1

Nếu bạn đang sử dụng Entity Framework 4.0, bạn sẽ có hỗ trợ cho POCO với tải hoãn lại & sẽ cho phép bạn viết một kho lưu trữ chung để thực hiện truy cập dữ liệu.

Có rất nhiều bài viết trực tuyến về mẫu kho lưu trữ chung với EF 4.0

HTH.

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