2013-07-03 28 views
18

Khi sử dụng Dagger, tôi thấy rằng tôi đang nhận được nhiều trường hợp của một singleton khi tôi tiêm nó bất cứ nơi nào tôi cần nó. Tôi đã chú thích lớp và phương thức cung cấp với @Singleton. Bất cứ ai có thể nghĩ về lý do tại sao điều này xảy ra?Singletons in Dagger 1.x

Edit:

Nếu nó giúp, tôi đã theo cấu trúc tương tự cho ứng dụng của tôi như các ứng dụng mẫu trong GitHub Dagger của (https://github.com/square/dagger/tree/master/examples/android-activity-graphs). Tôi đang cố gắng để có được Singleton trong hoạt động cơ sở và một vài lớp học bên thứ ba được cung cấp bằng cách sử dụng @Provides tại lớp tùy chỉnh Application. Có phải vì tôi cộng các mô-đun ở mỗi hoạt động với đồ thị đối tượng gốc không?

(PS: Tôi mới đến Dagger và DI nói chung, vì vậy tôi sẽ rất biết ơn nếu bạn có thể cung cấp một lời giải thích để tôi có thể học hỏi Cảm ơn..)

Trả lời

39

@Singleton, trong Dagger 1.x , hành động khác với bạn nghĩ. Định nghĩa đặc tả JSR-330 trong javadoc @Singleton là "một trên mỗi đồ thị" và đó là cách Dagger giải thích nó.

Vì vậy, nếu bạn có thứ gì đó được đánh dấu là @Singleton và được hiển thị trong biểu đồ ứng dụng của bạn (trái với biểu đồ ngắn hơn), thì bạn sẽ có một phiên bản cho mỗi ứng dụng.

Nếu bạn có một mục được chú thích @Singleton trong mô-đun bạn sử dụng để định cấu hình biểu đồ hoạt động của mình (tức là, được lấy từ phần biểu đồ được chỉ định bởi mô-đun được sử dụng trong thao tác cộng()) thì bạn sẽ nhận được biểu đồ một lần cho mỗi hoạt động.

Nếu bạn cần một cái gì đó để được một lần cho mỗi ứng dụng, bạn cần phải chắc chắn rằng nó được tạo ra như là một phần của đồ thị ứng dụng. Bạn có thể làm điều này theo một trong hai cách. Hoặc cung cấp một cách rõ ràng phương thức @Provides từ (các) mô-đun ứng dụng của bạn, hoặc bạn có thể liệt kê nó như là một trong các lớp trong @Module (injects = ...) trong một mô-đun ứng dụng.

(Nếu bạn không đánh dấu nó với @Singleton hơn bạn sẽ nhận được một trong mỗi vị trí tiêm.)

Vì vậy, hãy nhớ rằng, đồ thị được tạo ra bởi cộng() được xem như một đồ thị riêng biệt mà chỉ vào đồ thị từ đó nó được sinh ra, và kết thúc tốt đẹp nó, có thể truy cập các thể hiện bên trong nó, nhưng không phải là cùng một đồ thị.

Lưu ý - Dagger 2.x cải thiện điều này và hỗ trợ chú thích tùy chỉnh, mặc dù cơ chế tương tự, với một biểu đồ (thành phần) cho mỗi chú thích phạm vi, với mối quan hệ cha/con giữa các đồ thị có tuổi thọ rộng hơn/hẹp hơn

+0

Cảm ơn bạn đã xóa thông tin đó. Khi bạn nói spec, bạn đang đề cập đến JSR330? – Raghuveer

+0

Có. Xin lỗi - Tôi sẽ chỉnh sửa câu trả lời. –

+0

@ChristianGruber Làm thế nào điều này áp dụng cho Singleton tiêm Constructors được sử dụng trong các đồ thị phụ khác nhau của một biểu đồ cha mẹ? Điều đó có nghĩa là một đồ thị cho mỗi lớp được sử dụng, ngoại trừ khi nó đã tồn tại trong biểu đồ gốc? – vinc3m1

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