2010-04-07 28 views
11

Dự án hiện tại của chúng tôi đã gặp sự cố phụ thuộc vòng tròn. Hợp lý kinh doanh của chúng tôi đang sử dụng các lớp và các phương thức tĩnh từ assembly SharedLibrary của chúng tôi. SharedLibrary chứa một bó toàn bộ các hàm trợ giúp, chẳng hạn như lớp SQL Reader, Enumerators, Global Variable, Error Handling, Logging và Validation.Giải pháp phụ thuộc tròn

Thư viện được chia sẻ cần quyền truy cập vào đối tượng Doanh nghiệp, nhưng đối tượng Doanh nghiệp cần quyền truy cập vào SharedLibrary. Các nhà phát triển cũ đã giải quyết được mùi mã hiển nhiên này bằng cách sao chép chức năng của các đối tượng nghiệp vụ trong thư viện được chia sẻ (rất chống DRY). Tôi đã dành một ngày để cố gắng đọc về các lựa chọn của mình để giải quyết vấn đề này nhưng tôi đã đánh một kết thúc chết.

Tôi mở cho ý tưởng thiết kế lại kiến ​​trúc, nhưng chỉ là phương sách cuối cùng. Vậy làm thế nào tôi có thể có một Thư viện trợ giúp chia sẻ có thể truy cập các đối tượng nghiệp vụ, với các đối tượng kinh doanh vẫn đang truy cập Thư viện trợ giúp được chia sẻ?

+2

Câu hỏi rõ ràng là: Tại sao Thư viện được chia sẻ cần quyền truy cập vào Đối tượng kinh doanh? Nếu bạn có thể trả lời, bạn sẽ có một giải pháp. – Aaronaught

+0

SharedLibrary có một lớp biến toàn cục trừu tượng chứa đầy các thuộc tính tĩnh. Các thuộc tính này được tạo ra từ các giá trị từ cơ sở dữ liệu do đó cần cho các đối tượng nghiệp vụ, đây chỉ là một ví dụ của nhiều đối tượng. Và tất nhiên các đối tượng kinh doanh cần truy cập vào các hằng số đó. – gfoley

+2

Đây là lý do tại sao tôi không bao giờ sử dụng các thuật ngữ mơ hồ như "được chia sẻ" để mô tả một thư viện. Nó thực sự làm gì? Những gì bạn gọi là một thư viện được chia sẻ rõ ràng có quá nhiều trách nhiệm, và có lẽ thư viện đối tượng nghiệp vụ cũng vậy. Thông thường, các giải pháp này được giải quyết bằng cách đặt các lớp/giao diện * thực sự độc lập vào thư viện của riêng chúng. – Aaronaught

Trả lời

17

Bạn chỉ có thể tạo một dự án riêng biệt cho các đối tượng giá trị (không logic) và giao diện.

lớp thư viện được chia sẻ của bạn triển khai giao diện và Thư viện doanh nghiệp phụ thuộc vào giao diện (tôi có nghe thấy mã có thể kiểm tra và tách rời ở đây không? Không đề cập đến bạn xóa phụ thuộc từ Thư viện được chia sẻ).

Lý tưởng nhất, bạn có thể có các đối tượng kinh doanh mà trên đó thư viện được chia sẻ của bạn cũng phụ thuộc vào dự án bổ sung này. Nếu các đối tượng nghiệp vụ quá phức tạp, bạn cũng có thể chuyển đổi chúng thành các giao diện.

Bạn sẽ có cả hai dự án không phụ thuộc vào nhau, nhưng chỉ trên một dự án khác với chỉ "giả" đối tượng (không có logic):

kinh doanh ---> Giao diện và giá trị các đối tượng < --- Thư viện chia sẻ

Bây giờ chúng được tách riêng =)

+0

Đây là câu trả lời. – Strelok

+0

Nếu bạn định đi xa đến kiến ​​trúc sư này thì sự phụ thuộc tại sao dừng chân 5 phút của dòng kết thúc chứ không phải chỉ là kiến ​​trúc sư đi tất cả? Tại thời điểm đó, bạn sẽ không có thêm mã nào phụ thuộc vào các thực thể nghiệp vụ và có thể để lại mã chia sẻ thực sự cốt lõi trong dự án được chia sẻ. Đó sẽ là câu trả lời của tôi. –

+0

@Chris Đó không phải là một thay đổi lớn. Điều đó sẽ yêu cầu một số refactoring, nhưng không có thiết kế lại lớn hoặc cần phải sửa sang lại công cụ. –

0

Một giải pháp là đặt mẫu mặt tiền ở giữa. Ở đây bạn sẽ tránh truy cập trực tiếp/phụ thuộc vào các đối tượng kinh doanh của bạn từ thư viện được chia sẻ. Thay vào đó, bạn sẽ sử dụng một lớp hoạt động như một mặt tiền giữa lib và BO của bạn. Bằng cách này bạn có thể đóng gói các thư viện chia sẻ của bạn sạch sẽ và tách rời.

+1

Tôi chỉ cần nói 'trừu tượng hóa' mà không chỉ định tên mẫu cụ thể (nó có thể dễ dàng là bộ điều hợp, chiến lược, cầu nối) vì các mẫu thiết kế mục đích chính không giải quyết các vấn đề như thế này. –

3

Bất cứ khi nào bạn có thư viện "được chia sẻ", bạn hoàn toàn không được tham chiếu dự án tổ chức kinh doanh của mình. Làm như vậy sẽ gây ra vấn đề này xảy ra như bạn thấy rõ ràng.

Giải pháp cho việc này là xóa tất cả mã phụ thuộc của thực thể kinh doanh khỏi thư viện được chia sẻ và hoặc không tìm kiếm mã trợ giúp đó hoặc đặt mã trợ giúp bên trong chính dự án thực thể nghiệp vụ đó.

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