2017-02-21 68 views
1

我最近在.NET中编写了7年的代码之后开始使用Java,不要误解我的爱C#,但是工作需要,我需要改变。我的问题是关于Ioc注册,在C#中我用Windsor和SimpleInjector(我完全喜欢),在java中我想开始使用Guice。Auto使用Guice绑定所有的`Services`

我正在从事的项目是一个遗留项目,不会使用Ioc,这是泽西岛项目(与非功能HK2 IOC)。

现在对于我的问题,在C#上我注册了所有接口和具体实现应用程序启动运行时使用反射。

我已阅读Guice文档,找不到任何示例来执行此操作,并且JIT绑定尚未真正理解。

那么有可能这样做吗?这是最佳做法吗? (我不认为手工编写所有绑定在正确的道路)

任何实例或方向将是非常有益

谢谢

+0

您是如何看待非功能性Hk2的。 Hk2功能非常强大... Hk2还有一个强大的自动服务注册框架,使用@Service和ServiceLocator填充程序 – jwells131313

+0

@ jwells131313,我的意思是我们的系统中的HK2不可操作。 – guyl

回答

3

这是一个有点困难,在Java和吉斯做多在其他平台上:Java classloader专为finding classes by their package/name with fallbacks设计,而不是枚举类路径中的每个类或实现。尽管在规定的条件下(如ReflectionsGoogle Guava)存在一些库方案来处理后者,但通过遍历当前类加载器及其父类的每个类迭代通常是不可能的,因为通过URLClassLoader和类似的基于网络的类加载器,理论上该集合是无限的。

这使得通常和经常需要明确列出您的接口和实现以暴露给您的应用程序,无论您是否使用Guice。

参见:

因此,很难虽然通过Guice SPI你可能有更多的成就,如 “开始实现MyStartableService每个可到达班”,任务祝你好运“开始每个通过Guice请求的MyStartableService,然后再返回”。或者,您也可以使用内置于Java 6中的Java SPI framework(例如ServiceLoader)来允许合适服务的分片或分布式列表,然后可以通过调用模块中的bind将其提供给Guice。 (Olivier在评论中恰当地建议AutoService,这使得生成支持ServiceLoader的元数据文件变得非常容易。)

+1

如果采用SPI框架方式,请尝试使用Google的[AutoService](https://github.com/google/auto/tree/master/service):这是一种挽救生命的方式: java文件,你只需添加一个小标注,一切都自动完成。 –

+0

感谢您的详细解答, 我会尽力了解如何采取行动 – guyl