2013-07-17 23 views
1

基本上這兩種方法爲一個:是否可以將Guice的輔助和貼圖注射結合起來?

Can Guice automatically create instances of different classes based on a parameter?

Guice injecting only some of the constructor

例如: 用戶操作處理程序以映射和輔助注射創建的,即,每個需要一些靜態綁定以及操作上下文這是從請求動態創建的。

class OpHandler { void handle()... } 
class SendHandler extends OpHandler { 
    public SendHandler(DAL dal, SendContext context) { ... } 
} 
class ReceiveHandler extends OpHandler { 
    public ReceiveHandler(DAL dal, ReceiveContext context) { ... } 
} 

servlet: 
onGet() { 
    op = resolveOp(); 
    switch (op) { 
    SEND: create SendContext and pass it somehow to ioc.getInstance(SendHandler.class) 
    RECEIVE: create ReceiveContext and pass it somehow to ioc.getInstance(ReceiveHandler.class) 
    } 
} 

回答

0

您想使用AssistedInject。

import com.google.inject.AbstractModule; 
import com.google.inject.Guice; 
import com.google.inject.Inject; 
import com.google.inject.Injector; 
import com.google.inject.assistedinject.Assisted; 
import com.google.inject.assistedinject.FactoryProvider; 
import com.google.inject.name.Named; 
import com.google.inject.name.Names; 
import junit.framework.Assert; 
import org.junit.Test; 

import java.io.IOException; 

public class StackOverflowTest { 
    public static class Dal { 

    } 
    public static interface OpHandler { 

    } 
    public static class SendOpHandler implements OpHandler { 
     @Inject 
     public SendOpHandler(Dal dal, @Assisted String rest) { 

     } 
    } 
    public static class RecOpHandler implements OpHandler { 
     @Inject 
     public RecOpHandler (Dal dal, @Assisted String rest) { 

     } 
    } 
    public static interface OpHandlerProvider { 
     public OpHandler get(String rest); 
    } 

    public static class SUT { 
     OpHandlerProvider send; 
     OpHandlerProvider rec; 

     @Inject 
     public SUT(@Named("send") OpHandlerProvider send, @Named("rec") OpHandlerProvider rec) { 
      this.send = send; 
      this.rec = rec; 
     } 
    } 

    @Test 
    public void test() throws IOException { 
     Injector i = Guice.createInjector(new AbstractModule() { 
      @Override 
      protected void configure() { 
       bind(OpHandlerProvider.class).annotatedWith(Names.named("send")).toProvider(FactoryProvider.newFactory(OpHandlerProvider.class, SendOpHandler.class)); 
       bind(OpHandlerProvider.class).annotatedWith(Names.named("rec")).toProvider(FactoryProvider.newFactory(OpHandlerProvider.class, RecOpHandler.class)); 
      } 
     }); 

     SUT sut = i.getInstance(SUT.class); 
     Assert.assertTrue(sut.send.get("") instanceof SendOpHandler); 
     Assert.assertTrue(sut.rec.get("") instanceof RecOpHandler); 

    } 
} 
+0

感謝您的代碼。我理解輔助注射的概念,但我不認爲這是我所問的。在我的帖子中提到的例子中,我沒有看到映射綁定。這裏是鏈接:http://stackoverflow.com/questions/17669413/can-guice-automatically-create-instances-of-different-classes-based-on-a-paramet。 – Schultz9999

+0

*上下文是你需要設置的東西嗎? –

相關問題