绑定多个实现,具体取决于主机类

时间:2013-07-23 08:16:47

标签: java dependency-injection inversion-of-control guice

我有两个界面:UserServiceProjectService。它们中的每一个都有一个特定的实现类,分别名为UserServiceImplProjectServiceImpl。还有一个WorkflowManagementService类,它实现了上述两个接口,并作为其具体实现的代理。它还可以做更多的事情。

WorkflowManagementService会注入具体的UserServiceProjectService个实例。但是,对于应用程序的其余部分,只要有人需要UserSerivceProjectService个实例,就应该提供WorkflowManagementService

如何将注入器提供UserServiceImpl和ProjectServiceImpl(如果要在WorkflowManagementService注入,WorkflowManagementService用于任何其他引用?

1 个答案:

答案 0 :(得分:1)

我不知道如何根据类上下文执行此操作,但您可以使用绑定注释执行此操作:

public class Example {

  static interface UserService {}
  static interface ProjectService {}

  static class UserServiceImpl implements UserService {}
  static class ProjectServiceImpl implements ProjectService {}

  static class WorkflowManagementService implements UserService, ProjectService {
    @Inject
    @Named("concrete")
    UserService userService;

    @Inject
    @Named("concrete")
    ProjectService projectService;
  }

  static class Module extends AbstractModule {
    @Override
    protected void configure() {
      bind(UserService.class).to(WorkflowManagementService.class);
      bind(ProjectService.class).to(WorkflowManagementService.class);
      bind(UserService.class).annotatedWith(Names.named("concrete")).to(UserServiceImpl.class);
      bind(ProjectService.class).annotatedWith(Names.named("concrete")).to(ProjectServiceImpl.class);
    }
  }
}

在完成代码原型设计后,您可能希望使用实际注释而不是@Named