关于在物化服务类中集成Google Guice的建议

时间:2013-09-14 12:04:39

标签: java google-app-engine guice objectify

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

考虑以下用于客观化服务的基类

public abstract class OfyService<T> {

    private Class<T> clazz;

    public OfyService(Class<T> clazz) {
        this.clazz = clazz;
    }
    ... service methods 
}

,以下是用户实体服务类

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();
    }
}

我的所有实体服务类都将遵循这种模式。所以我正在检查Google Guice是否可以让它更好或当前的实施是否良好?

如果Guice模块可以很好地处理依赖关系,那么有人可以解释一下我在实现中究竟是如何应用的吗?

1 个答案:

答案 0 :(得分:0)

首先与Objectify有关,你看了Objectify Best practices。看起来他们可能会提出更直接的方法。

不使用ObjectifyService static ofy()方法,而是使用自己的方法。

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():

import static com.yourcode.OfyService.ofy;
Thing th = ofy().load().type(Thing).id(123L).now();

通过这种方式,实体注册仅在您需要之前进行一次。

关于启动性能,它取决于实例类和使用的实体的复杂性。通常即使在最低的实例类中,也可以在不到一秒的时间内实现大约20种实体类型。最有可能的情况是,如果您有数百种实体类型,则另一种方法可能是有意义的调查。

关于Guice。它与提供的代码有什么关系并不明显,但我会提出一些建议:

  • 一般来说,如果你注入你的实体类,你会让自己头疼,所以如果你真的必须注入课程,你很可能会想要避免这样做或者使用实体工厂。
  • 对于数据控制器或UserService(不是当前形式)等。他们通常会合理地选择将依赖项注入或用作注入的依赖项。