2010-04-13 30 views
7

Tôi có ứng dụng Swing mà tôi muốn chuyển đổi từ spaghetti sang sử dụng tiêm phụ thuộc với Guice. Sử dụng Guice để cung cấp các dịch vụ như hàng đợi cấu hình và nhiệm vụ đang diễn ra tuyệt vời nhưng bây giờ tôi bắt đầu trên GUI của ứng dụng và không chắc chắn về cách tiến hành.Cách sử dụng ứng dụng Guice in Swing

Ứng dụng về cơ bản là JFrame với một loạt các tab trong một số JTabbedPane. Mỗi tab là một phân lớp JPanel riêng biệt đưa ra các thành phần khác nhau và cần dịch vụ để thực hiện các hành động khi nhấn một số nút nhất định.

Trong ứng dụng hiện nay, điều này có vẻ hơi như thế này:

@Inject 
public MainFrame(SomeService service, Executor ex, Configuration config) { 
    tabsPane = new JTabbedPane(); 

    // Create the panels for each tab and add them to the tabbedpane 
    somePanel = new SomeTabPanel(service, ex, config); 
    tabsPane.addTab("Panel 1", somePanel); 

    someOtherPanel = new SomeOtherTabPanel(service, ex, config); 
    tabsPane.addTab("Panel 2", someOtherPanel); 

    ... do more stuff 
} 

Rõ ràng, điều này không chính xác theo thông lệ tốt nhất DI. Tôi không muốn phải @Inject các tab vì điều đó sẽ giúp tôi trở thành một nhà xây dựng với hàng tá tham số. Tôi muốn sử dụng Guice để tiêm các phụ thuộc cần thiết vào bất kỳ đối tượng tab nào mà tôi cần mà không cần phải chuyển tất cả các phụ thuộc đó cho các nhà xây dựng tab.

Tất cả các phụ thuộc cho các đối tượng tab là các dịch vụ Module của tôi biết, về cơ bản tất cả tôi nghĩ Tôi muốn làm là yêu cầu Guice cho các đối tượng cần thiết và xây dựng cho tôi.

+0

Bạn có thể xem dự án Guts-GUI (mà tôi sở hữu); đây là một khung công tác dựa trên Guice để viết các ứng dụng Swing. Mặc dù chưa chính thức phát hành nhưng hiện tại nó khá khả thi. URL là: http://kenai.com/projects/guts/pages/Guts-gui – jfpoilpret

+0

Tôi đã xem xét nó một thời gian ngắn nhưng có vẻ như điều này sẽ đòi hỏi phải viết lại hoàn toàn ứng dụng. Tôi đã có một hệ thống thực hiện nhiệm vụ rất mạnh mẽ và xe buýt sự kiện chẳng hạn. Ứng dụng không lớn (khoảng 20kloc) nhưng vẫn đủ lớn để không cân nhắc việc bắt đầu lại. –

Trả lời

3

Bạn có thể sử dụng Multibinding để ràng buộc tất cả các tab của mình dưới dạng Set không? Nếu họ triển khai một số giao diện cho phép bạn lấy tên để sử dụng cho tab, bạn có thể chỉ cần lặp qua việc thêm các tab từ tập hợp. Bạn có thể cần phải tìm một cái gì đó ra xa như đặt hàng các tab mặc dù.

+0

Một khả năng tôi sẽ xem xét. Tôi tin rằng Multibinding chỉ dành cho những trường hợp mà bạn không biết số lượng đối tượng bạn sẽ nhận được hoặc các loại thực tế của chúng. Trong trường hợp này tôi biết chính xác có bao nhiêu và loại nào, tôi chỉ không muốn xây dựng chúng theo cách thủ công vì vậy tôi không nghĩ rằng Multibinding là một kết hợp đủ tốt cho những gì tôi muốn làm. –

+0

Tôi đồng ý với @ColinD. +1 cho multibindings – gpampara

0

Không thể bạn chỉ tiêm dịch vụ trong JFrame và để cho các tab yêu cầu dịch vụ/cấu hình, như vậy

this.getTopLevelAncestor().getService() 

Tất nhiên đây chỉ hoạt động nếu gọi là sau khi họ đã được thêm vào một container .

+2

Tôi nghĩ điều đó sẽ làm cho mì spaghetti còn tệ hơn nữa. Nó sẽ thêm rất nhiều phôi vào 'MainFrame' và thực sự làm giảm khả năng tái sử dụng bất kỳ lớp nào vì chúng sẽ được kết hợp chặt chẽ với' MainFrame' thay vì chỉ phụ thuộc của chúng như bây giờ. –

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