2011-02-10 26 views
5

Tôi đang cố gắng xây dựng một hệ thống theo kho lưu trữ và đơn vị mẫu công việc để cho phép kiểm tra đơn vị thiếu hiểu biết, vv .. Tôi đang tìm kiếm lời khuyên về cách xử lý Rollback. Lý tưởng nhất là tôi muốn sử dụng POCO's nhưng tôi nghĩ rằng tôi có thể cần ít nhất là thực hiện một giao diện để cung cấp một vài bit và miếng.Đơn vị công việc, tùy chọn cuộn lùi

Vì vậy, giả sử chúng tôi có hai kho lưu trữ, một ngữ cảnh/đơn vị công việc.

Tôi thêm một mục, sửa đổi một mục khác và xóa mục thứ ba. Lặp lại cho kho thứ hai, sau đó tôi gọi rollback.

Trong quá khứ tôi đã sử dụng một cái gì đó giống như một DataSet cho việc này. Mỗi đối tượng có trạng thái đang chờ xử lýMới, đang chờAmended, pendingDeleted, clean. Ngoài ra còn có một bản sao cuối cùng tồn tại phiên bản của đối tượng cho rollback.

Bạn sẽ triển khai điều này bằng cách nào?

EDIT:

Ok, đây là những gì tôi nghĩ rằng tôi đang thực sự cố gắng để có được đầu của tôi xung quanh. Chuẩn bị để có khuôn mẫu :)

Cuối cùng, dự án là WPF MVVM. Vì vậy, chúng tôi đang xem Mô hình với cửa hàng ở đây.

Tôi nghĩ rằng tôi đã cố gắng để mô hình hóa với ý tưởng về kho lưu trữ, khi tôi nghĩ mô hình nên sử dụng UOW và kho lưu trữ để cung cấp các tính năng mà mô hình cần cung cấp. Điều đó có tốt hơn không?

Tôi muốn có sự thiếu hiểu biết lâu dài hoàn toàn, vì vậy hãy tưởng tượng miền của tôi bao gồm Khách hàng, Đơn đặt hàng và Đơn đặt hàng.

GUI giả sử có một nút đặt hàng mới cho phép người dùng điền chi tiết khách hàng, chi tiết đơn đặt hàng và chi tiết đơn đặt hàng 1-n. Ông nhấn lưu và họ đi đến cơ sở dữ liệu, ông nhấn hủy họ không. Vì vậy, trong trường hợp này, mô hình có thể yêu cầu CustomerRepository cho một khách hàng, sau đó OrderRepository cho một Order mới, sau đó OrderLineRepository cho mỗi Line mới, sau đó yêu cầu Unit of Work lưu chúng.

Điều đó có hợp lý không? Nó cho tôi, tôi nghĩ đó là nơi mà sự phân chia được xác định. Tôi hơi bị cám dỗ khi có một API khác giữa mô hình và kho lưu trữ. Không, đó là ngớ ngẩn.

CHỈNH SỬA 2: Đây là một bài viết tuyệt vời có loại helped một chút.

Trả lời

6

Tôi đã thiết kế đơn vị công việc và các lớp kho lưu trữ của mình tương tự như cách mô tả được mô tả here on MSDN. Ý tưởng cơ bản của lớp IUnitOfWork là nó xử lý tất cả các công việc cơ sở dữ liệu.

Sau đó tôi đã thêm (vào số IUnitOfWork lớp và triển khai của mình) phương thức BeginTransaction(), mở một đối tượng TransactionScope() và sau đó thêm phương thức EndTransaction(bool commit). Phương thức này xử lý việc đóng giao dịch bằng cách thực hiện giao dịch với cơ sở dữ liệu (nếu đúng) hoặc quay lại giao dịch (nếu sai).

Điều này cho phép tôi kiểm soát các giao dịch phức tạp, cho phép nhiều cam kết được khôi phục.

Chỉnh sửa: Dòng suy nghĩ của tôi là bạn muốn đối tượng UnitOfWork biết về kho lưu trữ chứ không phải theo cách khác. Đây là ý kiến ​​của tôi, và bạn sẽ tìm thấy những người thích đối diện nhưng đây là lý do tại sao.

Khi bạn muốn xử lý cơ sở dữ liệu theo một cách nào đó, bạn muốn nó bị ràng buộc bởi đơn vị công việc hiện tại của bạn. Vì vậy, với tôi nó có ý nghĩa hợp lý để đi qua các đơn vị công việc để truy cập vào kho của bạn, thay vì có kho lưu trữ của bạn truy cập vào đơn vị công việc của bạn. Nếu bạn cần phân nhánh và thực hiện nhiều việc trên các cơ sở dữ liệu khác nhau (ví dụ, nếu dữ liệu lịch sử được ghi vào một cơ sở dữ liệu khác với dữ liệu trực tiếp, hoặc nếu bạn đang làm phân vùng cơ sở dữ liệu ngang), kể từ khi nó được tạo ra. mỗi cơ sở dữ liệu sẽ có đơn vị công việc riêng. Lý do là nếu bạn tạo kho lưu trữ biết về đơn vị công việc, bạn cần tạo một đơn vị công việc cho từng cơ sở dữ liệu, cộng với bản sao của mỗi kho lưu trữ mà bạn cần cho mỗi đơn vị công việc bạn có thể cần truy cập nó.

Cuối cùng, việc giữ quyền truy cập vào kho lưu trữ của bạn khi chỉ được truy cập thông qua đơn vị công việc của bạn sẽ giúp API đơn giản cho nhà phát triển. Để bắt đầu, bạn chỉ cần khởi tạo 1 đối tượng (đơn vị công việc) thay vì 1 đơn vị đối tượng công việc cộng với nhiều đối tượng kho lưu trữ mà bạn có thể cần. Nó giữ mã của bạn đơn giản (imho) và làm cho mọi việc dễ bị lỗi hơn một chút đối với các nhà phát triển.

+0

Đó là một bài viết hay, tôi chưa từng thấy điều đó trước đây. Tôi nghĩ rằng tôi vẫn đang đấu tranh một chút với các lớp học biết lớp nào khác, tức là kho lưu trữ biết về đơn vị công việc, đơn vị công việc có biết về tất cả các kho lưu trữ không? Trên thực tế, đây là một câu hỏi hay: Tôi sẽ đặt nó trong một chỉnh sửa ở trên nếu điều đó là ok ... – Ian

+0

Tôi đã thêm phản hồi của mình vào bản chỉnh sửa vì quá dài để nhận xét – KallDrexx

+0

Kall, đó gần như chính xác cách tôi đã thực hiện quá khứ, và nó có ý nghĩa hoàn hảo với tôi :) Tôi sẽ coi đó là câu trả lời, nhưng nếu bất cứ ai kịch liệt không đồng ý xin hãy nói :) – Ian

2

Rất khó để nói chắc chắn mà không cần thêm chi tiết, nhưng tôi sẽ xem xét triển khai từ giao diện IDbConnection và các giao diện được liên kết. Nó cung cấp cho bạn một giao diện hầu hết các trình lập trình C# với bất kỳ trải nghiệm nào sẽ quen thuộc.

Dưới mui xe, thành thật mà nói, nó thực sự phụ thuộc vào hiệu quả nếu cơ chế lưu trữ của bạn. Nếu nó xử lý rất nhiều thay đổi một cách hiệu quả, thì bạn có lẽ tốt hơn khi có cơ chế rollback của bạn xây dựng một danh sách các hành động cần thực hiện để khôi phục, được loại bỏ trên một 'commit'. Nếu mặt khác các bản cập nhật rất tốn kém, thì bạn có cơ chế giao dịch duy trì một danh sách các hành động để thực hiện trên một cam kết, được loại bỏ trên một rollback. Bạn cũng cần phải suy nghĩ về việc liệu mã khác có nên xem các cập nhật trước khi thực hiện một cam kết hay không; với cách tiếp cận cũ họ sẽ, với cách tiếp cận thứ hai, họ sẽ không.

+0

Vâng, tôi đánh rất nhiều "nó phụ thuộc", và tôi hoàn toàn đánh giá cao điều đó. Tôi có thể thấy một nửa tá cách thực hiện cụ thể, và đã làm như vậy trong quá khứ, nhưng nó xác định trừu tượng mà tôi đang đấu tranh với, đặc biệt làm như vậy dưới ánh sáng hướng dẫn của các mẫu này. – Ian

0

Tôi sẽ thực hiện điều này bằng cách sử dụng một khung như NHibernate hoặc Entity Framework để thực hiện việc này.:) NHibernate cho phép bạn sử dụng POCO và thực hiện tất cả hệ thống ống nước cho bạn.

+0

Một trong những mục tiêu của tôi là có một lớp kiên trì cho cả NHibernate và EF ngoài/sau đơn vị công việc. Có hai dự án, một là thực tế công việc thực tế thế giới, khác là thử nghiệm thử nghiệm giàn khoan và nó là giàn khoan tôi đang làm việc trên tại thời điểm này để có được hình dạng của mã xuống. – Ian

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