Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy Guice-基于外部参数动态选择提供程序_Groovy_Guice - Fatal编程技术网

Groovy Guice-基于外部参数动态选择提供程序

Groovy Guice-基于外部参数动态选择提供程序,groovy,guice,Groovy,Guice,在guice中,是否有一种方法可以根据一些外部参数选择绑定的特定实现 例如: 公共接口服务{ void sendMessage() } 类EmailService实现服务{ 公共电子邮件服务(){} @凌驾 void sendMessage(){ println“发送电子邮件…” } } 类SMSService实现服务{ 公共电子邮件服务(){} @凌驾 void sendMessage(){ println“发送短信…” } } 类客户端{ 私人服务 @注入 客户(服务){ 这个。服务=服务

在guice中,是否有一种方法可以根据一些外部参数选择绑定的特定实现

例如:

公共接口服务{
void sendMessage()
}
类EmailService实现服务{
公共电子邮件服务(){}
@凌驾
void sendMessage(){
println“发送电子邮件…”
}
}
类SMSService实现服务{
公共电子邮件服务(){}
@凌驾
void sendMessage(){
println“发送短信…”
}
}
类客户端{
私人服务
@注入
客户(服务){
这个。服务=服务
}
公共无效发送(){
service.sendMessage()
} 
}
公共类ServiceProvider实现提供程序{
服务获取(){
返回新的SMSService()//是否在此处选择实现?
} 
}
公共类MyModule扩展了AbstractModule{
@凌驾
受保护的void configure(){
bind(Service.class).toProvider(ServiceProvider.class).in(Scopes.SINGLETON)
}    
}
公共静态void main(字符串…参数){
Injector=Guice.createInjector(新的MyModule())
客户端c=injector.getInstance(Client.class)
c、 发送()
}

在上面的示例中,我被迫选择在provider get()方法中使用哪个提供程序。如果我想让它更具动态性,例如,基于用户偏好,是否有办法等待在运行时选择提供程序并让guice注入它?

对于此类问题,guice提供:

公共类SnacksModule扩展了AbstractModule{
受保护的void configure(){
MapBinder MapBinder
=MapBinder.newMapBinder(binder(),String.class,Snack.class);
addBinding(“twix”).toInstance(new twix());
mapbinder.addBinding(“snickers”).toProvider(SnickersProvider.class);
将绑定(“skittles”)添加到(skittles.class);
}
}
使用此绑定,现在可以注入映射:

class SnackMachine {
   @Inject
   public SnackMachine(Map<String, Snack> snacks) { ... }
}
classsnackmachine{
@注入
公共小吃机(地图小吃){…}
}

您可以预先定义所有服务,然后根据配置值从映射中选择具体实例(或提供程序)。

对于此类问题,guice提供:

公共类SnacksModule扩展了AbstractModule{
受保护的void configure(){
MapBinder MapBinder
=MapBinder.newMapBinder(binder(),String.class,Snack.class);
addBinding(“twix”).toInstance(new twix());
mapbinder.addBinding(“snickers”).toProvider(SnickersProvider.class);
将绑定(“skittles”)添加到(skittles.class);
}
}
使用此绑定,现在可以注入映射:

class SnackMachine {
   @Inject
   public SnackMachine(Map<String, Snack> snacks) { ... }
}
classsnackmachine{
@注入
公共小吃机(地图小吃){…}
}

您可以预先定义所有服务,然后根据配置值从映射中选择具体实例(或提供程序)。

对于此类问题,guice提供:

公共类SnacksModule扩展了AbstractModule{
受保护的void configure(){
MapBinder MapBinder
=MapBinder.newMapBinder(binder(),String.class,Snack.class);
addBinding(“twix”).toInstance(new twix());
mapbinder.addBinding(“snickers”).toProvider(SnickersProvider.class);
将绑定(“skittles”)添加到(skittles.class);
}
}
使用此绑定,现在可以注入映射:

class SnackMachine {
   @Inject
   public SnackMachine(Map<String, Snack> snacks) { ... }
}
classsnackmachine{
@注入
公共小吃机(地图小吃){…}
}

您可以预先定义所有服务,然后根据配置值从映射中选择具体实例(或提供程序)。

对于此类问题,guice提供:

公共类SnacksModule扩展了AbstractModule{
受保护的void configure(){
MapBinder MapBinder
=MapBinder.newMapBinder(binder(),String.class,Snack.class);
addBinding(“twix”).toInstance(new twix());
mapbinder.addBinding(“snickers”).toProvider(SnickersProvider.class);
将绑定(“skittles”)添加到(skittles.class);
}
}
使用此绑定,现在可以注入映射:

class SnackMachine {
   @Inject
   public SnackMachine(Map<String, Snack> snacks) { ... }
}
classsnackmachine{
@注入
公共小吃机(地图小吃){…}
}

您可以预先定义所有服务,然后根据配置的值从映射中选择具体实例(或提供者)。

我不会使用注入。您可以将所有服务注入客户机,然后执行常规的if/else逻辑来选择要使用的服务。否则会在注入器上创建一个丑陋的依赖关系。绑定所有实现似乎是一个好主意。提到的if-else逻辑的条件可以通过系统属性传递,例如,我不会通过注入来传递。您可以将所有服务注入客户机,然后执行常规的if/else逻辑来选择要使用的服务。否则会在注入器上创建一个丑陋的依赖关系。绑定所有实现似乎是一个好主意。提到的if-else逻辑的条件可以通过系统属性传递,例如,我不会通过注入来传递。您可以将所有服务注入客户机,然后执行常规的if/else逻辑来选择要使用的服务。否则会在注入器上创建一个丑陋的依赖关系。绑定所有实现似乎是一个好主意。提到的if-else逻辑的条件可以通过系统属性传递,例如,我不会通过注入来传递。您可以将所有服务注入客户机,然后执行常规的if/else逻辑来选择要使用的服务。否则会在注入器上创建一个丑陋的依赖关系。绑定所有实现似乎是一个好主意。提及的if-else逻辑条件可通过系统属性传递,例如。