2011-03-22 24 views
2

首先,我喜歡Guice所做的事情,但是我也希望在我的系統中公開使用少量的類。我係統中的所有服務都是封裝私有的,只有公共接口。如果不使用提供者,這會給Guice帶來一些問題。我寧願一些替代的,讓我提供一個策略執行以下操作:如何使用Guice注入包私人類

  1. 的成分C
  2. 需要依賴X,Y,Z
  3. 調用此方法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. 
} 
  1. 吉斯得到所有組件通過調用註冊ComponentDiscoverer。
  2. 然後它調用註冊的ComponentDiscoverer.components();
  3. 對於每個ComponentDefinition.requiredDependencies()
  4. 按需調用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); 
} 

我的生活模塊在不同的包和所有創作會突破件廠,因爲其他一切都包私有。

+1

吉斯工作得很好用包範圍類。只需將Guice模塊添加到包中即可。你能舉一個你不能讓Guice創建的課程的例子嗎? – NamshubWriter 2011-03-22 06:10:47

+0

@NamshubWriter:我在q的底部添加了一個示例。 – 2011-03-22 06:33:37

回答

5

除非您的應用程序非常簡單,否則您不應該只有一個Module。你需要應該有一個模塊,用於你想要使用包私有類的每個包。這允許你將這些包私有類綁定到公共接口。這是使用Guice的標準做法,在文檔的Keep Constructors Hidden部分提及。

在包一個模塊,你只需要正常@Inject能夠構造函數或供應商的方法:

@Provides @Alpha Service alpha(Dependency dependency) { 
    return ServiceImpl.create(dependency); 
}