2011-03-22 67 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); 
}