2012-02-10 74 views
2

標題描述了我的問題。如何使用Guice`Module`注入構造函數接受Class的地方?

E.g.

public class EntryDAOModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(EntryDAO.class).to(EntryDTOMongoImpl.class); // what should this be?  
    } 
} 

如圖所示,應該是什麼參數.to,給出以下:

public class GenericDAOMongoImpl<T, K extends Serializable> extends BasicDAO<T, K> { 
    public GenericDAOMongoImpl(Class<T> entityClass) throws UnknownHostException { 
     super(entityClass, ConnectionManager.getDataStore()); 
    } 
} 

public class EntryDAOMongoImpl extends GenericDAOMongoImpl<EntryDTOMongoImpl, ObjectId> implements EntryDAO<EntryDTOMongoImpl> { 
    private static final Logger logger = Logger.getLogger(EntryDAOMongoImpl.class); 

    @Inject 
    public EntryDAOMongoImpl(Class<EntryDTOMongoImpl> entityClass) throws UnknownHostException { 
     super(entityClass); 
    } 
    ... 
} 

我如何實例化EntryDAOMongoImpl類,像這樣:

Injector injector = Guice.createInjector(new EntryDAOModule()); 
this.entryDAO = injector.getInstance(EntryDAO.class); // what should this be? 
+0

你想從EntryDAOMongImpl的構造提供EntryDTOMongoImpl.class的超級GenericDAOMongoImpl的()構造函數? – 2012-02-10 05:12:23

+0

@johncarl - 對不起 - 添加了'GenericDAOMongoImpl'類來澄清。 – wulfgarpro 2012-02-10 05:13:55

+0

啊,我明白了......在回答路上 – 2012-02-10 05:15:45

回答

2

什麼你會在這裏需要創建一個工廠。使用輔助注射可以幫助你。

你可以看到我的previous post regarding assisted injection

但這裏是你的情況下精確解:

EntryDAOMongoImpl:

public class EntryDAOMongoImpl extends GenericDAOMongoImpl<EntryDTOMongoImpl, ObjectId> implements EntryDAO<EntryDTOMongoImpl> { 
    private static final Logger logger = Logger.getLogger(EntryDAOMongoImpl.class); 

    @Inject 
    public EntryDAOMongoImpl(@Assisted Class<EntryDTOMongoImpl> entityClass) throws UnknownHostException { 
     super(entityClass); 
    } 
    ... 
} 

廠:

public interface EntryDAOFactory { 
    public EntryDAOMongoImpl buildEntryDAO(Class<EntryDTOMongoImpl> entityClass); 
} 

模塊:

public class EntryDAOModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     //bind(EntryDAO.class).to(EntryDAOMongoImpl.class); // what should this be? 

     FactoryModuleBuilder factoryModuleBuilder = new FactoryModuleBuilder(); 
     install(factoryModuleBuilder.build(EntryDAOFactory.class)); 
    } 
} 

用法:

Injector injector = Guice.createInjector(new EntryDAOModule()); 
EntryDAOFactory factory = injector.getInstance(EntryDAOFactory.class); 
this.entryDAO = factory.buildEntryDAO(entityClass); 

如果你將要使用EntryDAOMongoImpl作爲singelton(單身海事組織的自然使用),那麼你可以不用你的模塊內輔助注射執行以下操作:

public class EntryDAOModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     EtnryDTOMongoImpl dto = new EntryDTOMongoImpl(TargetEntry.class); //guessing here 
     bind(EntryDAO.class).toInstance(new EntryDAOMongoImpl(dto)); // singleton 
    } 
} 

讓我知道這是否有助於

+0

這個工作;我將不得不更多地閱讀DI和Guice - 這似乎破壞了目的?我現在需要爲所有遵循上述習慣用法的DTO創建一個工廠。此外,如果我想使用不同的DTO實現,現在必須在兩個位置進行更改; 'EntryDAOFactory'和用法類中。 – wulfgarpro 2012-02-10 06:14:07

+0

根本沒有擊敗目的。您可以在同一構造函數中包含非@ Assisted注入​​依賴項。這種技術減輕了大量的Factory樣板。 – 2012-02-10 15:32:43

+0

考慮到你的問題,我添加了一個替代方案。 – 2012-02-11 06:56:55

相關問題