2012-10-23 12 views
6

Có vẻ như GWT có cơ chế DI nướng riêng (GWT.create(Class<?>)). GIN cung cấp những lợi ích gì cho vấn đề này? Bạn có nên sử dụng chúng cùng với nhau hay chúng độc quyền lẫn nhau không? Tôi thích Guice vì vậy tôi bị cám dỗ sử dụng GIN, nhưng không muốn giới thiệu nó nếu GWT đã làm những thứ tương tự ngay ra khỏi hộp.GWT.create (Class <?>) so với GIN?

Trả lời

8

Gin và GWT.create có một vài khác biệt - Gin cung cấp phụ thuộc thông qua chú thích @Inject, trên trường, bộ đặt hoặc hàm tạo, trong khi GWT.create là đặc biệt về việc triển khai. Gin sẽ sử dụng bất kỳ hàm tạo nào mà bạn cung cấp, nhưng bạn phải cung cấp loại thay thế cụ thể, trong khi GWT.create sẽ chỉ hoạt động với hàm tạo mặc định và 'quy tắc rebind' của bạn không cần phải chính xác và thậm chí có thể tạo các lớp mới được tạo tại thời gian biên dịch. Nó cũng có thể xem môi trường người dùng đang chạy và chọn một bộ quy tắc cụ thể dựa trên điều đó, mà Gin không thể làm được.

Gin thực sự sử dụng GWT.create để nhận các tính năng khác này - nếu bạn không có quy tắc được xác định, Gin sẽ tự động gọi số GWT.create. Điều này có nghĩa là nếu bạn có quy tắc như

@Inject MyRemoteServiceAsync rpcService; 

Gin sẽ gọi GWT.create để tạo cuộc gọi rpc đó. Điều này cũng hoạt động cho UiBinder, Trình điều khiển Trình soạn thảo, Thông báo I18n và Các hằng số, v.v.

Nếu bạn đã hiểu và thích Guice, Gin không phải là bước quan trọng đối với bạn, và bạn vẫn có khả năng gọi trực tiếp GWT.create, hoặc ngầm yêu cầu Gin làm điều đó. Trong thực tế, để thậm chí sử dụng Gin, bạn cần phải gọi GWT.create(MyGinjector.class) để có được bóng lăn.

8

GWT.create() không có gì liên quan đến việc tiêm phụ thuộc. Đây là phương pháp nhà máy.

Sự khác biệt duy nhất giữa GWT.create(SomeThing.class)new SomeThing() là lớp chính xác SomeThing có thể được thay thế hoặc tạo bằng cách sử dụng cái gọi là deferred binding. Nhưng không có gì trong GWT.create() về việc cung cấp các phụ thuộc cho đối tượng GWT.create() d chẳng hạn.