0

我正在考虑将 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 模块在我的情况下可以很好地处理依赖关系,谁能解释我在我的实现中究竟是如何应用的?

4

1 回答 1

0

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

不要使用 ObjectifyService 静态 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。它与提供的代码的关系并不明显,但我会建议几件事:

  • 通常,如果您注入实体类,您会给自己造成 DI 头痛,因此如果您确实必须注入类,您很可能希望避免这样做或使用实体中的工厂。
  • 至于数据控制器或 UserService(不是您当前的形式)等。它们通常会成为合理的候选者,将依赖项注入或用作注入的依赖项。
于 2013-09-14T19:30:25.030 回答