Tôi muốn có thể tiêm thực thi chung một giao diện chung bằng cách sử dụng Guice.Tiêm thực hiện chung bằng cách sử dụng Guice
public interface Repository<T> {
void save(T item);
T get(int id);
}
public MyRepository<T> implements Repository<T> {
@Override
public void save(T item) {
// do saving
return item;
}
@Override
public T get(int id) {
// get item and return
}
}
Trong C# sử dụng Castle.Windsor, tôi muốn có thể to do:
Component.For(typeof(Repository<>)).ImplementedBy(typeof(MyRepository<>))
nhưng tôi không nghĩ là tương đương tồn tại trong Guice. Tôi biết tôi có thể sử dụng TypeLiteral
trong Guice để đăng ký triển khai cá nhân, nhưng có cách nào để đăng ký tất cả cùng một lúc như trong Windsor?
Edit:
Dưới đây là một ví dụ về việc sử dụng:
Injector injector = Guice.createInjector(new MyModule());
Repository<Class1> repo1 = injector.getInstance(new Key<Repository<Class1>>() {});
Repository<Class2> repo2 = injector.getInstance(new Key<Repository<Class2>>() {});
Mặc dù việc sử dụng nhiều khả năng sẽ được tiêm vào lớp khác:
public class ClassThatUsesRepository {
private Repository<Class1> repository;
@Inject
public ClassThatUsesRepository(Repository<Class1> repository) {
this.repository = repository;
}
}
Bạn có thể thêm một đoạn mã cho thấy làm thế nào bạn sẽ thích _use_ này? –
Tôi ở bên bạn, tôi cũng muốn làm điều tương tự. Mọi người nên có vấn đề này. Phải có một cái gì đó họ không nói với chúng tôi. :) – PapaFreud
Tôi muốn biết các giải pháp quá, tôi không biết gì về C#, nhưng rõ ràng cách C# là hiện đại hơn nhiều. – Mike