2011-10-05 10 views
3

での結合、私は次のような問題があります。Guiceの:ランタイム注入/コマンドライン

@Inject 
    MyClass(Service service) { 
     this.service = service; 
    } 

    public void doSomething() { 
     service.invokeSelf(); 
    } 

を私は今、私の問題は、私は、ユーザーが動的注入を選択できるようにしたい一つのモジュール

bind(service).annotatedWith(Names.named("serviceA").to(ServiceAImpl.class); 
bind(service).annotatedWith(Names.named("serviceB").to(ServiceBImpl.class); 

をあるきランタイムベースではコマンドラインパラメータを使用します。

public static void Main(String args[]) { 
    String option = args[0]; 
    ..... 
} 

どうすればいいですか?これを行うには複数のモジュールを作成する必要がありますか?

答えて

6

実行時に繰り返し選択する必要がある場合は、mapbinderを使用する実装は非常に適切です。

次のような構成を持っている:

@Override 
protected void configure() { 
    MapBinder<String, Service> mapBinder = MapBinder.newMapBinder(binder(), String.class, Service.class); 
    mapBinder.addBinding("serviceA").to(ServiceAImpl.class); 
    mapBinder.addBinding("serviceB").to(ServiceBImpl.class); 
} 

は、次に、あなたのコード内だけでマップを注入し、あなたの選択に基づいて適切なサービスを入手:

@Inject Map<String, Service> services; 

public void doSomething(String selection) { 
    Service service = services.get(selection); 
    // do something with the service 
} 

であなたも、インジェクタを移入することができます選択したサービスはcustom scopesです。

4

私はあなたが実際にやりたいことより、このようなものだと思う:

public class ServiceModule extends AbstractModule { 
    private final String option; 

    public ServiceModule(String option) { 
    this.option = option; 
    } 

    @Override protected void configure() { 
    // or use a Map, or whatever 
    Class<? extends Service> serviceType = option.equals("serviceA") ? 
     ServiceAImpl.class : ServiceBImpl.class; 
    bind(Service.class).to(serviceType); 
    } 
} 

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(new ServiceModule(args[0])); 
    // ... 
} 
3

@ColinDは良い方法があります。私は

public static void main(String[] args) { 
    Module m = "serviceA".equals(args[0]) ? new AServiceModule() : new BServiceModule(); 
    Injector injector = Guice.createInjector(m); 
    // ... 
} 

(両方の答えで)基本的な考え方は、インジェクタが構築される前に、あなたの選択を行うことができれば、あなたは常にそれを行うことを選択すべきであることを示唆しているかもしれません。

私はスタイルの問題として、モジュール内のロジックの量を最小限に抑えたいと思います。しかし、再び、スタイルの問題。

関連する問題