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