2009-08-03 30 views
11

bạn có thể nhận được 2 bản sao đơn lẻ cùng loại cơ bản không?Nhận nhiều đơn cùng loại cùng loại

điều này rõ ràng là không đáng kể vào mùa xuân vì nó dựa trên các trường hợp được đặt tên mà bạn đính kèm phạm vi nhưng tôi không thể thấy tương đương trong guice đó là về các kiểu ràng buộc với các lớp triển khai. Lưu ý rằng tôi không muốn phải liên kết với cá thể đó vì các cá thể đang được đề cập được tiêm các phụ thuộc khác bởi guice.

Trả lời

15

Thật dễ dàng trong Guice! Tạo hai chú thích đấu thầu, nói @One@Two và sau đó

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton()); 
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton()); 

và sau đó

@Inject 
public SomethingThatDependsOnSingletons(@One MySingleton s1, 
    @Two MySingleton t2) { ... } 
+0

hoặc phương pháp @Provides nếu nó có phụ thuộc, tôi đã bỏ qua bit tài liệu này (http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) Phụ thuộc có thể được truyền vào làm tham số cho phương thức. Các vòi phun sẽ thực hiện các ràng buộc cho mỗi trong số này trước khi gọi phương pháp. – Matt

+0

Bạn không cần phải ràng buộc nó vào một thể hiện. Hai chú thích khác nhau cho cùng một lớp, trong phạm vi singleton, sẽ tạo ra hai cá thể riêng biệt đã có. –

+2

@Filip, tôi đã thử những gì bạn đang đề xuất và đã nhận được cùng một phiên bản cho cả hai chú thích. Tôi đã sử dụng 'bind (MySingleton.class) .annotatedWith (One.class) .to (MySingleton.class) .in (Singleton.class); ràng buộc (MySingleton.class) .annotatedWith (Hai.class) .to (MySingleton.class) .in (Singleton.class); ' –

13

Tôi muốn bổ sung cho phản ứng Marcin của, bằng cách thêm mà bạn không cần phải giới hạn mình để sử dụng toInstance() hoặc phương pháp cung cấp trong tình huống như vậy.

Sau đây sẽ chỉ làm việc cũng như:

bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class); 

[...]

@Inject 
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... } 

Guice sẽ bơm phụ thuộc như thường lệ khi instantiating lớp MartyMcFly và DocBrown.


Lưu ý rằng nó cũng làm việc khi bạn muốn để ràng buộc nhiều độc thân của cùng loại:

bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class); 

Để làm việc này, bạn phải chắc chắn rằng Person không bị ràng buộc trong Singleton phạm vi, hoặc rõ ràng trong mô-đun Guice hoặc với chú thích @Singleton. Chi tiết khác trong this Gist.

Chỉnh sửa: Mã mẫu mà tôi đưa ra làm ví dụ đến từ Guice Grapher Test. Nhìn vào các bài kiểm tra Guice là một cách tuyệt vời để hiểu rõ hơn cách sử dụng API (cũng áp dụng cho mọi dự án có các bài kiểm tra đơn vị tốt).

+1

Tôi thích ví dụ –

+0

Cảm ơn Jesse :) Mã mẫu tôi đã sử dụng để minh họa cho điểm của mình đến từ một bài kiểm tra cho phần mở rộng Guice Grapher. Tôi nghĩ nó rất vui và dán nó như là. Tôi nên đã đặt một liên kết đến nguồn, mặc dù (tôi sẽ làm điều đó ngay bây giờ). Ngoài ra, tôi yêu blog của bạn và đặc biệt là các bài viết thực tiễn của bạn về Guice/Google Collections (http://publicobject.com/). Chúng tôi cần nhiều blog hơn như blog của bạn. Vì vậy, cảm ơn cho điều này, quá. –

+0

@eneveu, bạn cho rằng giải pháp của bạn là một giải pháp thay thế cho Marcin. Nó xuất hiện với tôi rằng trường hợp sử dụng bạn mô tả khác với của mình, bởi vì bạn giả định có hai lớp thực hiện trình điều khiển khác nhau (MartyMcFly, DocBrown), trái ngược với hai trường hợp của một lớp (Driver) cụ thể. Khi tôi cố gắng sử dụng kỹ thuật này trong trường hợp thứ hai, tôi nhận được hai tham chiếu đến cùng một singleton bằng cách sử dụng này: 'bind (MySingleton.class) .annotatedWith (One.class) .to (MySingleton.class) .in (Singleton.class)); ràng buộc (MySingleton.class) .annotatedWith (Hai.class) .to (MySingleton.class) .in (Singleton.class); ' –

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