Я хотел бы иметь возможность внедрить общую реализацию общего интерфейса с помощью Guice.Вводная реализация с использованием 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
}
}
В C# с помощью Castle.Windsor, я был бы в состоянии to do:
Component.For(typeof(Repository<>)).ImplementedBy(typeof(MyRepository<>))
, но я не думаю, что эквивалентно существует в Guice. Я знаю, что могу использовать TypeLiteral
в Guice для регистрации отдельных реализаций, но есть ли способ зарегистрировать их все сразу, как в Виндзоре?
Edit:
Вот пример использования:
Injector injector = Guice.createInjector(new MyModule());
Repository<Class1> repo1 = injector.getInstance(new Key<Repository<Class1>>() {});
Repository<Class2> repo2 = injector.getInstance(new Key<Repository<Class2>>() {});
Хотя более вероятно использование было бы введение в другой класс:
public class ClassThatUsesRepository {
private Repository<Class1> repository;
@Inject
public ClassThatUsesRepository(Repository<Class1> repository) {
this.repository = repository;
}
}
Не могли бы вы добавить фрагмент кода, показывающим, как вы бы нравится _use_ это? –
Я с вами, я хочу сделать то же самое. У всех должна быть эта проблема. Должно быть, они не говорят нам. :) – PapaFreud
Я тоже хотел бы знать решение, я ничего не знаю о C#, но очевидно, что C# намного более современен. – Mike