Java 在Objectify服务类中集成googleguice的建议

Java 在Objectify服务类中集成googleguice的建议,java,google-app-engine,guice,objectify,Java,Google App Engine,Guice,Objectify,我正在考虑在我的新项目中集成GoogleGuice,该项目使用objectify进行数据存储操作 考虑objectify服务的以下基类 public abstract class OfyService<T> { private Class<T> clazz; public OfyService(Class<T> clazz) { this.clazz = clazz; } ... service method

我正在考虑在我的新项目中集成GoogleGuice,该项目使用objectify进行数据存储操作

考虑objectify服务的以下基类

public abstract class OfyService<T> {

    private Class<T> clazz;

    public OfyService(Class<T> clazz) {
        this.clazz = clazz;
    }
    ... service methods 
}
yservice的公共抽象类{
私人课堂;
公共服务(班级){
this.clazz=clazz;
}
…服务方法
}
下面是用户实体服务类

public final class UserService extends OfyService<User> {

    static {
        factory().register(User.class);
    }

    private UserService() {
        super(User.class);
    }

    public static UserService getInstance() {
        return UserServiceSingleton._userService;
    }

    private static class UserServiceSingleton {
        public static final UserService _userService = new UserService();
    }
}
公共最终类UserService扩展了yservice{
静止的{
factory().register(User.class);
}
私有用户服务(){
super(User.class);
}
公共静态用户服务getInstance(){
返回UserServiceSingleton.\u userService;
}
私有静态类UserServiceSingleton{
公共静态最终用户服务_UserService=new UserService();
}
}
我的所有实体服务类都将遵循此模式。所以我在检查Google Guice是否能让它变得更好,或者当前的实现是否良好


如果Guice模块在我的例子中能够很好地处理依赖关系,那么有人能解释一下这在我的实现中是如何应用的吗?

首先与Objectify相关的是,您是否查看了。看起来他们可能会提出更直接的方法

不要使用ObjectifyService static of y()方法,而是使用您自己的方法

public class OfyService {
   static {
      factory().register(Thing.class);
      factory().register(OtherThing.class);
      ...etc
   }

   public static Objectify ofy() {
      return ObjectifyService.ofy();
   }

   public static ObjectifyFactory factory() {
      return ObjectifyService.factory();
   }
}
现在在代码中,导入您自己的静态ofy():

这样,实体注册只进行一次,并且总是在您需要之前进行

关于启动性能,它取决于所使用实体的实例类和复杂性。一般来说,即使是在最低的实例类上,在不到一秒钟的时间内也可能有大约20种实体类型。很可能只有当您有数百种实体类型时,另一种方法才有意义

关于Guice。它与所提供的代码之间的关系并不明显,但我想提出几点建议:

  • 通常,如果您注入实体类,您会使自己感到DI头痛,因此,如果您确实必须注入类,您很可能希望避免这样做或使用实体中的工厂
  • 对于数据控制器或用户服务(不是您当前的形式)等,它们通常是合理的候选对象,可以将依赖项注入或用作注入依赖项

ya我遵循了objectify最佳实践,并根据我的需要实现了,除了实体注册部分,我用抽象类封装了该部分,但仍然有可能在其他部分查询时未注册实体,这将解决该问题。谢谢
import static com.yourcode.OfyService.ofy;
Thing th = ofy().load().type(Thing).id(123L).now();