9

Tôi đã xem một số bài viết trên các trang web khác nhau đề xuất giải quyết phụ thuộc vòng tròn giữa các hội đồng .NET bằng cách sử dụng tiêm phụ thuộc. Điều này có thể giải quyết các lỗi xây dựng nhưng nó không thực sự giải quyết sự phụ thuộc vòng tròn, phải không? Với tôi, dường như vẫn còn một lỗi logic trong kiến ​​trúc. Tôi có điên hay làm những người khác đồng ý 1) đây là cách sử dụng DI kém hơn, và 2) không phải là cách thích hợp để giải quyết các vấn đề phụ thuộc vòng tròn?giải quyết phụ thuộc vòng tròn với tiêm phụ thuộc

+0

Mặc dù nói chung một thiết kế lại nên được thực hiện, đây là một tham chiếu: http://stackoverflow.com/questions/1316518/how-did-microsoft-create-assemblies-that-have-circular-references/1316558# 1316558 – Dykam

Trả lời

3

DI không dành cho độ phân giải phụ thuộc vòng tròn mà là để tạo thuận lợi cho việc tạo các thành phần được tách riêng độc đáo và do đó tạo ra các thành phần có thể kiểm tra được.

29

Nếu bạn có phụ thuộc vòng tròn giữa hai đối tượng, điều đó có nghĩa là bạn cần một đối tượng thứ ba, trên đó hai đối tượng sẽ phụ thuộc vào, vì vậy chúng sẽ không phụ thuộc lẫn nhau. Đây là một bài viết mà là giải pháp chính xác cho vấn đề của bạn:

http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/

+3

+1 Liên kết tuyệt vời - bài viết đó giải thích nó rất tốt! – Ergwun

6
  1. Có, bạn làm cho nó thậm chí còn khó khăn hơn để phát hiện ra chúng bằng cách sử dụng thêm một lớp trừu tượng.
  2. Bạn hoàn toàn không giải quyết sự phụ thuộc vòng tròn nhưng ẩn nó bằng cách thêm một lớp trừu tượng bổ sung, sử dụng giới hạn trễ, hoặc/và liên kết lỏng lẻo nó.

Câu trả lời tương tự trong các bài viết sau (mà tôi sẽ thêm để tham khảo) là tạo lớp thứ ba mà cả hai phụ thuộc vào. Điều này có nghĩa là: bạn đang vi phạm Nguyên tắc Trách nhiệm Duy nhất. Bằng cách di chuyển (giải nén) trách nhiệm cả hai lớp phụ thuộc vào trong một lớp riêng biệt, bạn sẽ loại bỏ sự phụ thuộc vòng tròn.

FYI các Single Responsibility Pattern on Wikipedia

thảo luận StackOverflow bởi những người khác:

My answer trên StackOverflow với một ví dụ về giải nén trách nhiệm trong một lớp riêng biệt.

1

tôi sẽ quăng trong tôi 0.02 $ ở đây kể từ khi tôi tìm thấy bài hữu ích này bằng cách tìm kiếm "loại bỏ phụ thuộc chu kỳ"

Yes. Bạn có thể sử dụng DI để giải quyết các phụ thuộc vòng tròn. Bước đầu tiên để khắc phục bất kỳ vấn đề nào là tìm ra nó. Ninject phàn nàn về sự phụ thuộc vòng tròn của tôi và đã ném một ngoại lệ hữu ích vào việc khởi động. Ninject đã tìm thấy nó cho tôi và buộc tôi phải sửa nó. Tôi có thể ăn gian và sử dụng tiêm tài sản hoặc phương pháp tiêm nhưng phá vỡ bảo vệ của tôi về bất biến lớp (đó là tôi nghĩ rằng những gì bạn đang phàn nàn về).

Vì vậy, một phiếu bầu cho ctor tiêm qua IoC bởi vì nó sẽ phát hiện phụ thuộc vòng tròn cho bạn. Đó là sau đó vào bạn để refactor và loại bỏ các lỗi kiến ​​trúc.