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

Java 绑定多个实现,具体取决于主机类,java,dependency-injection,inversion-of-control,guice,Java,Dependency Injection,Inversion Of Control,Guice,我有两个接口:UserService和ProjectService。它们每个都有一个特定的实现类,分别名为userserviceinpl和projectserviceinpl。还有一个WorkflowManagementService类,它实现了上述两个接口,并作为它们具体实现的代理。它还可以在上面做更多的事情 WorkflowManagementService注入了具体的UserService和ProjectService实例。但是,对于应用程序的其余部分,只要有人需要UserSerivce或

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

WorkflowManagementService
注入了具体的
UserService
ProjectService
实例。但是,对于应用程序的其余部分,只要有人需要
UserSerivce
ProjectService
实例,就应该提供
WorkflowManagementService


如果要在
WorkflowManagementService
中注入
UserServiceImpl
和ProjectServiceImpl,如何使注入器提供它们,和
WorkflowManagementService
是否有其他参考?

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

公共类示例{
静态接口用户服务{}
静态接口ProjectService{}
静态类UserServiceImpl实现UserService{}
静态类ProjectServiceImpl实现ProjectService{}
静态类WorkflowManagementService实现UserService、ProjectService{
@注入
@命名为(“混凝土”)
用户服务用户服务;
@注入
@命名为(“混凝土”)
项目服务项目服务;
}
静态类模块扩展了抽象类模块{
@凌驾
受保护的void configure(){
绑定(UserService.class).to(WorkflowManagementService.class);
绑定(ProjectService.class).to(WorkflowManagementService.class);
将(UserService.class).annotatedWith(Names.named(“concrete”))绑定到(userserviceinpl.class);
绑定(ProjectService.class).annotatedWith(Names.named(“concrete”)).to(projectserviceinpl.class);
}
}
}

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

如果您想进一步封装绑定,可以使用,并且只公开WorkflowManagementService。这将阻止其他使用者访问甚至查看带注释的键。您可能仍然需要某种注释,因为PrivateModules无法覆盖其父模块中的绑定。(妮特:我更喜欢“非托管”而不是“具体”,因为UserService仍然是一个接口。:)