通用实现的概念问题

时间:2011-09-18 20:11:57

标签: java oop guice

上下文:使用Guice 3.0的Java


'大家好,我正在尝试为我的网络应用程序构建一个不错的转换器库 转换器允许我从未知类型转换为另一种类型。

要转换类型,我正在使用Guice MultiBinder的转换器注册表,如this one (following @Ivan Sopov's implementation)
一个例子可能更明确:

**NOTICE : this is not a working example**
//"obj" is an object with unknowed type, and we want to convert it to another type)

Converter c = converterRegistry.getConverter(obj.getClass(),type.getClass());
Object t = c.convert(obj); //obj is now converted !

我可以有很多种转换器:StringToInteger,StringToDouble等;对于那些简单的我没有问题。

public interface Converter<F,T>{
    public T convert(F from);
}

public class StringToInteger implements Converter<String,Integer>{
   public Integer convert(String from){
       return Integer.valueOf(from);
   }
}

当我必须实现需要更多参数的转换器(转换类型的特定信息)时出现问题。

例如:DateToString转换器
在这种情况下,我将使用当前用户Locale将Date格式化为String。

目前我正在使用另一个参数来解决问题,我的转换器界面就是这样:

public interface Converter<F,T>{
    public T convert(F from, ConverterData data);
}

public class ConverterData{
     private Locale locale;
     //... many other object that can be usefull for other converter...
}

public class DateToString implements Converter<Date,String>{
   public String convert(Date from, ConverterData data){
       //using data.getLocale() to convert the Date to String and return it
   }
}

现在,我正在寻找更好的解决方案来改进代码。我想过使用Guice的一些可能的解决方案,但我并不完全相信......

以下是其中之一:

public class DateToString implements Converter<Date,String>{

   private Provider<Locale> providerLocale;

   @Inject
   public DateToString(Provider<Locale> providerLocale){
       this.providerLocale = providerLocale;
   }

   public String convert(Date from){
       //using providerLocale.get() to convert the Date
   }
}

在这里,我正在使用提供商,因为转换器可能在@Singleton ...中 (也许我使用提供商时错了?)

- 我该怎么做?

好吧,我试图充分解释我的问题。我希望有人会花时间阅读:)

我在等你的帮助,提前谢谢! PS:很难找到这篇文章的标题,欢迎提出任何建议!

1 个答案:

答案 0 :(得分:0)

看起来你想要一个由当前请求的语言环境状态配置的转换器。

您与提供商走在正确的轨道上。你给我发声的原因。我会解释一下。

因为你将使用converterRegistry来获取转换器,所以看起来你将为每个请求使用相同的对象。

供应商是工厂,使用guice来提供价值。由于您希望使用每个请求状态配置DataToString转换器,因此您可以为重用对象上的convert方法的每次调用配置语言环境。

接下来,您需要创建一个Guice提供程序类或Local方法。如果你已经知道如何做到这一点,那就完成了。

为了更全面地集成guice,我建议您使用Guice-servlet将其插入到您的请求中:http://code.google.com/p/google-guice/wiki/Servlets