使用 Guice 注入通用实现

2023-12-05

我希望能够使用 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 中注册各个实现,但是有没有办法像在 Windsor 中一样一次性注册它们?

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;
  }
}

为了在 Guice 中使用泛型,您需要使用类型文字类来绑定通用变体。这是 Guice 注入器配置的示例:

package your-application.com;

import com.google.inject.AbstractModule;
import com.google.inject.TypeLiteral;

public class MyModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(new TypeLiteral<Repository<Class1>>(){})
      .to(new TypeLiteral<MyRepository<Class1>>(){});
  }
}

(Repository是泛型接口,MyRepository是泛型实现,Class1是泛型中使用的具体类)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Guice 注入通用实现 的相关文章

随机推荐