2013-08-29 28 views
3

如前所述here,番石榴的ServiceManager可以通过如何利用番石榴的ServiceManager与吉斯注射

ServiceManager manager = injector.getInstance(ServiceManager.class); 

取得为了使这项工作,我说在我的吉斯模块如下:

@Provides 
public Set<Service> services(){ 
    return ImmutableSet.<Service>of(MyService()); 
} 

在我的主类

ServiceManager manager = injector.getInstance(ServiceManager.class); 
manager.startAsync().awaitHealthy(); 

如何获取已启动的服务的实例?

p.s.将服务设置为@Singleton感觉就像是黑客。

+0

我想我有同样的问题,但在另一种形式。我管理插件而不是服务。基本上,它涉及Multibinder和私有模块。我得到它在这里回答:http://stackoverflow.com/questions/6625837/generalize-guices-robot-legs-example-with-multibinding –

+0

嗨@tanyehzheng它是一个Web应用程序或桌面之一? – Njax3SmmM2x2a0Zf7Hpd

+0

虽然我尝试的是桌面应用程序,但我的问题并不是特定于桌面应用程序还是Web应用程序。 – tanyehzheng

回答

0

在我看来,将服务设置为@Singleton根本不是黑客行为。这可能是我会做的。

@Provides @Singleton 
public MyService myService() { 
    return new MyService(); 
} 

@Provides 
public Set<Service> services(MyService myService) { 
    return ImmutableSet.<Service>of(myService); 
} 

然后,你可以注入任何你想要的,你想要的任何特殊服务实例。

+0

如果这是使用它的预期方式,我认为他们应该说清楚,因为忘记注释为@Singleton并最终得到一个新的未启动的服务实例很容易。调试这类问题相当困难。 – tanyehzheng

+0

它是否也是ServiceManager上的服务? – Njax3SmmM2x2a0Zf7Hpd

2

ServiceManager.getServicesByState().get(RUNNING)返回正在运行的服务,ServiceManager.getServicesByState().values()返回由ServiceManager管理的所有服务。