2011-01-25 28 views
26

Tôi cần phải ràng buộc một lớp như thực hiện hai giao diện. Và nó phải được ràng buộc trong một phạm vi đơn.Cách liên kết một triển khai với một vài giao diện với Google Guice?

Những gì tôi đã làm:

bind(FirstSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 
bind(SecondSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 

Nhưng, rõ ràng, nó dẫn đến việc tạo ra hai trường hợp khác nhau, bởi vì họ đang binded cho các phím khác nhau.

Câu hỏi của tôi là làm cách nào tôi có thể làm điều đó?

Trả lời

50

wiki của Guice có a documentation about this use case.

Về cơ bản, đây là những gì bạn nên làm:

// Declare that the provider of DefaultSettings is a singleton 
bind(DefaultSettings.class).in(Singleton.class); 

// Bind the providers of the interfaces FirstSettings and SecondSettings 
// to the provider of DefaultSettings (which is a singleton as defined above) 
bind(FirstSettings.class).to(DefaultSettings.class); 
bind(SecondSettings.class).to(DefaultSettings.class); 

Không cần phải xác định bất kỳ lớp học thêm: chỉ cần nghĩ về Provider s và câu trả lời đi chứ không phải tự nhiên.

+1

Giải pháp thanh lịch nhất! –

2

Vì vậy, DefaultSettings là một thực hiện của cả hai FirstSettingsSecondSettings, ví dụ:

public class DefaultSettings implements FirstSettings, SecondSettings 
{ 
} 

Hãy nói rằng bạn có một lớp EngineAEngineB

public class EngineA 
{ 
    @Inject 
    private FirstSettings settings; 
} 

public class EngineB 
{ 
    @Inject 
    private SecondSettings settings; 
} 

và bạn muốn tiêm cùng thực hiện.

Bạn có thể khai báo một giao diện DefaultSettingsInterface

public interface DefaultSettingsInterface extends FirstSettings, SecondSettings 
{ 
} 

và làm cho DefaultSettings thực hiện DefaultSettingsInterface

public class DefaultSettings implements DefaultSettingsInterface 
{ 
} 

Sau đó cấu hình có thể là:

bind(FirstSettings.class).to(DefaultSettingsInterface.class); 
bind(SecondSettings.class).to(DefaultSettingInterface.class); 
bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class); 
+1

Cảm ơn, Boris! Tôi tin rằng giải pháp của bạn hoạt động! Tôi vừa tìm một cách khác một mình: liên kết (FirstSettings.class). đến (DefaultSettings.class). trong (Singleton.class); liên kết (SecondSettings.class). đến (FirstSettings.class). trong (Singleton.class); Dường như nó cũng hoạt động. Bạn nghĩ sao? – Pavel

+1

Tôi không thể biết rằng FirstSettings mở rộng SecondSettings. Trong trường hợp đó, nó hợp lệ và ngắn hơn nhiều. Đăng giải pháp của bạn như là một câu trả lời và sau một thời gian quảng cáo nó là tốt nhất :) –

+0

Vâng, đó là sự thật. Lỗi của tôi, tôi không đề cập đến điều đó :) – Pavel

3

Các giải pháp, tôi đã tìm thấy là:

bind(FirstSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 
bind(SecondSettings.class). 
    to(FirstSettings.class). 
    in(Singleton.class); 

Nó hoạt động trong trường hợp của tôi, bởi vì SecondSettings mở rộng FirstSettings.

+1

Chỉ hoạt động nếu SecondSettings là một lớp con, subinterface của FirstSettings. Có những giải pháp cho trường hợp này và những trường hợp khác không có liên kết tồn tại giữa FirstSettings và SecondSettings. –

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