是否可以将辅助和映射注射与Guice结合使用?

时间:2013-07-17 07:31:11

标签: java dependency-injection 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)
    }
}

1 个答案:

答案 0 :(得分: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);

   }
}