2
首先,我喜欢Guice所做的事情,但是我也希望在我的系统中公开使用少量的类。我系统中的所有服务都是封装私有的,只有公共接口。如果不使用提供者,这会给Guice带来一些问题。我宁愿一些替代的,让我提供一个策略执行以下操作:如何使用Guice注入包私人类
- 的成分C
- 需要依赖X,Y,Z
- 调用此方法W/X,Y,Z向创建实例。
..再次重复所有组件。
在上述伪代码的第2步中,Guice现在扫描@inject注释。如果这个策略可用,我可以决定如何使用通用的方式查找组件的依赖关系。
不幸的是,Module.bind并不工作,因为它可以工作于类文字。
对上述战略的界面看起来可能是这样
interface ComponentDiscoverer {
Set<ComponentDefinition> components();
}
interface ComponentDefinition<T> {
List<RequiredDependency> requiredDependencies(); // similar to Guice's Key
<T> create(List<SatisfiedDependency> dependencies); // factory method.
}
- 吉斯得到所有组件通过调用注册ComponentDiscoverer。
- 然后它调用注册的ComponentDiscoverer.components();
- 对于每个ComponentDefinition.requiredDependencies()
- 按需调用ComponentDefinition.create
这是任何内置到吉斯方式或第三方库来实现上述?
样品
package companyX;
public interface Service {
void execute();
}
package companyX;
package private class ServiceImpl implements Service {
static ServiceImpl create(Dependency dependency){
return new ServiceImpl(dependency);
}
private ServiceImpl(Dependency dependency){
}
void execute();
}
package companyX;
package private class ServiceImpl2 implements Service2{
}
package companyX;
public class Factory {
Service alpha(Dependency){
return ServiceImpl.create(dependency);
}
Service beta(DifferentDependency){
// boring left out
}
Service2 gamma(AnotherDifferentDependency);
}
我的生活模块在不同的包和所有创作会突破件厂,因为其他一切都包私有。
吉斯工作得很好用包范围类。只需将Guice模块添加到包中即可。你能举一个你不能让Guice创建的课程的例子吗? – NamshubWriter 2011-03-22 06:10:47
@NamshubWriter:我在q的底部添加了一个示例。 – 2011-03-22 06:33:37