gpt4 book ai didi

java - 在 Play Framework 中根据参数注入(inject)依赖

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:33 26 4
gpt4 key购买 nike

我在数据库中为 consumerId 跟踪服务提供商列表。

我有一个 SchedulerActor,它为每个为 consumerId 启用的服务提供商创建 TaskActor

我想将 ServiceProvider 的实现注入(inject)到列表中每个服务提供者的 TaskActor 中。 ServiceProvider 可以有不同的实现。

interface ServiceProvider {
void processRequest(Request request);
}

class SchedulerActor {
@Override
public void onReceive(Object consumerId) throws Exception {
List<String> serviceProvidersList = getFromDatabase((String) consumerId);
for (String serviceProviderStr : serviceProvidersList) {

//serviceProviderStr could be "ServiceProvider1" or "ServiceProvider2"
ServiceProvider serviceProvider = getServiceProviderFromStr(serviceProviderStr);

ActorRef r = getContext().actorOf(Props.create(TaskActor.class, serviceProvider));
getContext().watch(r);
routees.add(new ActorRefRoutee(r));

}
router = new Router(new BroadcastRoutingLogic(), routees);
router.route(message, getSelf());
}
}

class TaskActor {
private final ServiceProvider serviceProvider;
public TaskActor(ServiceProvider serviceProvider) {
this.serviceProvider = serviceProvider;
}

@Override
public void onReceive(Object message) {
if (message instanceof Request) {
serviceProvider.processRequest((Request)message);
}
}
}
  1. getServiceProviderFromStr(String) 中是如何实现这一目标的?
  2. 我不想添加 switchif else 语句来返回所需的实现。
  3. 我能否在运行时提供提供者绑定(bind),将字符串传递给提供者对象?

最佳答案

另一种使用相同命名绑定(bind)而不是提议的@Assisted 的方法

@Inject 
public Injector injector;
...
ServiceProvider s = injector.getInstance(Key.get(Parent.class, Names.named(serviceName)));

在 configure() 中绑定(bind)的类:

bind(ServiceProvider.class).annotatedWith(Names.named("Name1")).to(Child1.class);
bind(ServiceProvider.class).annotatedWith(Names.named("Name2")).to(Child2.class);

关于java - 在 Play Framework 中根据参数注入(inject)依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com