2011-09-14 69 views
3
  • 嗨! 今天,我想過一種優化的,並有一些問題...

語境: 我使用的吉斯2.使用Guice進行註冊表優化


在我的web應用程序使用Java進行開發,我有一個轉換器的註冊表,以實時轉換爲某種類型。 A轉換器的描述如下:

public class StringToBoolean implements Converter<String, Boolean> 
{ 

    @Override 
    public Boolean convert(String from) 
    { 
     return Boolean.valueOf(from); 
    } 

} 

我的註冊表是不是地圖莫屬:

public class ConverterRegistryImpl implements ConverterRegistry 
{ 

    private Map<Key,Converter<?,?>> converterRegistry = new HashMap<Key, Converter<?,?>>(); 

    @Override 
    public <F, T> void register(Class<F> fromType, Class<T> toType, Converter<F, T> converter) 
    { 
     converterRegistry.put(new Key(fromType,toType), converter); 
    } 

} 

最後註冊我的轉換器在我的註冊表(類:servlet模塊:configureServlets ())
我認爲這一步可以優化...

ConverterRegistryImpl registry = new ConverterRegistryImpl(); 
registry.register(String.class, Integer.class, new StringToInteger()); 
registry.register(String.class, Boolean.class, new StringToBoolean()); 
... 
//Then I bind the registry to this current instance... 
bind(ConverterRegistry.class).toInstance(registry) 

這樣我可以隨處使用它像這樣:

@Inject 
ConverterRegistry converter; 

  • 嗯,我搜索來實現這個使用吉斯的最佳方式。
  • 更一般地說,你是如何在Guice(或沒有)的情況下建立這種註冊表的?

在此先感謝!

+0

嗯,沒有吉斯的1.2版本... –

+0

是的,我做一個失誤。我正在使用版本2,謝謝 – Jarod

回答

2

不知道「優化」是什麼意思。你的方法的缺點之一是你手工創建了轉換器和註冊表,所以你不會爲它們使用依賴注入的好處。你也不能累積來自不同模塊的轉換器。

這可以固定multibindings擴展吉斯:http://code.google.com/p/google-guice/wiki/Multibindings

Injector injector = Guice.createInjector(new Module() { 
     @Override 
     public void configure(Binder binder) { 
      @SuppressWarnings("rawtypes") 
      Multibinder<Converter> converterBinder = Multibinder.newSetBinder(binder, Converter.class); 
      converterBinder.addBinding().to(StringBooleanConverter.class); 
      converterBinder.addBinding().to(BooleanStringConverter.class); 
     } 
    }); 
    ConverterRegistryImpl registry = injector.getInstance(ConverterRegistryImpl.class); 

完整的代碼avaliable在:https://gist.github.com/1217563

+0

好的,然後檢索一個特定的轉換器。我必須檢查每個轉換器是否可以轉換2種類型(從類型&類型)?? – Jarod

+0

不,你可能會看到我在setter中使用了你的方法: void register(Type爲的類,類到Type,轉換器轉換器) –

+0

Oh ok!我們必須保持地圖,或者檢查每個轉換器是否更好? !這是一個很好的解決方案 - 我會更新我的項目。謝謝 ! – Jarod