2011-12-13 20 views
33

Tôi có lớp này:Guice Beginner - Làm thế nào để ràng buộc các lớp cụ thể?

public class House { 
    private final Door door; 
    private final Window window; 
    private final Roof roof; 

    @Inject 
    public House(Door door, Window window, Roof roof) { 
     this.door = door; 
     this.window = window; 
     this.roof = roof; 
    } 
} 

đâu Door, WindowRoof là lớp bê tông. Bây giờ nếu tôi muốn thực hiện một mô-đun cho kịch bản này, tôi sẽ làm điều đó như thế này:

public class HouseModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Door.class).to(Door.class); 
     bind(Window.class).to(Window.class); 
     bind(Roof.class).to(Roof.class); 
    } 
} 

Nhưng tôi tự hỏi nếu điều này là đúng cách để ràng buộc các lớp bê tông, hoặc nếu có nhiều cách dễ dàng hơn. Tôi cảm thấy có một cách dễ dàng hơn.

EDIT

Chỉ cần cố gắng này ra, và nó dường như không làm việc:

1) Binding points to itself. 
    at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10) 

EDIT 2

Nó có vẻ như không có ràng buộc là cần thiết ở tất cả:

Injector injector = Guice.createInjector(); 
House house = injector.getInstance(House.class); 

Cũng có vẻ như hoạt động.

Trả lời

22

Guice's Just-In-Time binding thực hiện chính xác những gì bạn muốn.Với bạn Door, WindowRoof đáp ứng các yêu cầu sau đây (trích dẫn từ Guice documentation):

hoặc là một công cộng, không có đối số nhà xây dựng, hoặc một constructor với chú thích @Inject

một module rỗng thực hiện sẽ là đủ:

public class HouseModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    } 
} 
+0

Mô đun trống ở đâu? Làm thế nào để Guice biết liên quan đến chúng? – djechlin

+0

@djechlin Điều này sẽ phụ thuộc vào cách ứng dụng của bạn được cấu hình. Ví dụ: ứng dụng dựa trên [Play] (https://www.lightbend.com/play-framework) sẽ mong đợi một tệp mô-đun nằm trong gói gốc hoặc có thể định cấu hình thông qua 'play.modules.enabled' trong ứng dụng .conf – Siddhartha

40

Đây là con đường để đi:

protected void configure() { 
    bind(Door.class); 
    bind(Window.class); 
    bind(Roof.class); 
} 

Vì họ là lớp bê tông, như Guice nói, bạn không thể ràng buộc họ phải tự :-)

Kiểm tra các Binder tài liệu, nó ghi chú:

bind(ServiceImpl.class); 

tuyên bố này làm cơ bản không có gì; nó "liên kết lớp ServiceImpl với chính nó" và không thay đổi hành vi mặc định của Guice. Bạn vẫn có thể muốn sử dụng điều này nếu bạn thích lớp Module của mình để phân phát dưới dạng tệp kê khai rõ ràng cho các dịch vụ do nó cung cấp. Ngoài ra, trong một số ít trường hợp, Guice có thể không xác nhận được ràng buộc tại thời điểm tạo phun, trừ khi nó được đưa ra một cách rõ ràng.

Lớp bê tông có hàm tạo được đánh dấu là @Inject sẽ tự động có sẵn để tiêm. Nhưng nó giúp các nhà phát triển (bạn) biết những gì được cấu hình trong module.

+0

Thực sự nhầm lẫn - có "tự động có sẵn trong mô-đun" có nghĩa là tất cả các mô-đun trong dự án của bạn trên toàn cầu? Hoặc là nó nhận thức được mô-đun gói địa phương hoặc nó phù hợp dựa trên tên mô-đun hoặc một cái gì đó? – djechlin

+0

Nó chỉ có nghĩa là bạn thậm chí không cần phải chỉ ra làm thế nào để ràng buộc vì cửa, cửa sổ và mái nhà là các lớp cụ thể. Chúng có sẵn trong tất cả các mô-đun. Nếu bạn có các triển khai khác nhau của một giao diện cụ thể, THÌ bạn phải giúp Guice. – Jalayn

+0

Bạn không cần một mô-đun khi bạn không cần phải ràng buộc một giao diện cho một lớp học. – Noya

6

Cần có ràng buộc để liên kết lớp Giao diện và triển khai (để thay đổi sang triển khai khác trong ví dụ thí nghiệm). Nhưng vì bạn có các lớp cụ thể, không cần phải ràng buộc đến, chỉ cần ràng buộc các lớp học

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