Điều gì có hiệu quả nhất đối với chúng tôi là sử dụng Assisted Inject.
Tùy thuộc vào từng trường hợp, chúng tôi đã xác định các nhà máy hoạt động trong chính hoạt động đó, trong một gói (để xây dựng tất cả các hoạt động trong gói đó) hoặc trong ActivityMapper.
public class MyActivity extends AbstractActivity {
private final MyView view;
@Inject
MyActivity(MyView view, @Assisted MyPlace place) {
this.view = view;
...
}
...
}
public class MyActivityMapper implements ActivityMapper {
public interface Factory {
MyActivity my(MyPlace place);
FooActivity foo(FooPlace place);
...
}
// using field injection here, feel free to replace by constructor injection
@Inject
private Factory factory;
@Overrides
public Activity getActivity(Place place) {
if (place instance MyPlace) {
return factory.my((MyPlace) place);
} else if (place instance FooPlace) {
return factory.foo((FooPlace) place);
}
...
}
}
// in the GinModule:
install(new GinFactoryModuleBuilder().build(MyActivityMapper.Factory.class));
BTW, cho phương pháp tiêm để làm việc, bạn vẫn phải tạo ra các hoạt động của bạn thông qua GIN, vì vậy bạn sẽ có vấn đề tương tự như với constructor injection. Không có phép thuật, GIN sẽ không tiêm ma thuật các lớp mà nó không biết và thậm chí không biết khi nào chúng được khởi tạo. Bạn có thể kích hoạt phun phương pháp một cách rõ ràng bằng cách thêm phương pháp để Ginjector của bạn, nhưng tôi sẽ không khuyên bạn nên nó (mã của bạn sẽ phụ thuộc vào các Ginjector, mà là một cái gì đó bạn nên tránh nếu bạn có thể):
interface MyGinjector extends Ginjector {
// This will construct a Foo instance and inject its constructors, fields and methods
Foo foo();
// This will inject methods and (non-final) fields of an existing Bar instance
void whatever(Bar bar);
}
...
Bar bar = new Bar("some", "arguments");
myGinjector.whatever(bar);
...
Một cuối cùng từ: Tôi sẽ không chuyển trực tiếp đối tượng địa điểm đến hoạt động. Cố gắng phân tách các địa điểm và hoạt động, cho phép bạn di chuyển mọi thứ (ví dụ: tạo phiên bản di động hoặc máy tính bảng, nơi bạn chuyển đổi giữa chế độ xem chính và chi tiết, thay vì hiển thị chúng cạnh nhau) bằng cách thay đổi bố cục "vỏ" và người lập bản đồ hoạt động. Để thực sự phân tách chúng, bạn phải tạo một số loại hoa tiêu , điều này sẽ trừu tượng các cuộc gọi placeController.goTo()
của bạn để các hoạt động của bạn không bao giờ xử lý các địa điểm.
Nguồn
2012-03-29 12:45:25
Hi Thomas, Đó chính xác là những gì chúng tôi làm trong ứng dụng của chúng tôi (sử dụng nhà máy) và nó hoạt động tốt. Tuy nhiên, làm cách nào bạn đề xuất tích hợp nó với AsyncProvider của GIN để tách mã? (chúng tôi đang sử dụng ActivityAsyncProxy http://ars-codia.raphaelbauer.com/2011/04/gwt-gin-and-simple-split-points.html) –