Spring 在Play框架中使用依赖项注入的示例用例

Spring 在Play框架中使用依赖项注入的示例用例,spring,dependency-injection,guice,playframework,Spring,Dependency Injection,Guice,Playframework,我是依赖注入和Play框架的忠实粉丝,但我很难看到如何将两者结合起来加以利用 Spring和Guice有一些模块,但是Play的工作方式让我很难看到DI除了一些非常简单的情况之外还有什么好处 这方面的一个很好的例子是Play期望JPA工作通过与相关实体关联的静态方法完成: @Entity Person extends Model { public static void delete(long id) { em().find(id).remove(); }

我是依赖注入和Play框架的忠实粉丝,但我很难看到如何将两者结合起来加以利用

Spring和Guice有一些模块,但是Play的工作方式让我很难看到DI除了一些非常简单的情况之外还有什么好处

这方面的一个很好的例子是Play期望JPA工作通过与相关实体关联的静态方法完成:

@Entity
Person extends Model {
    public static void delete(long id) {
        em().find(id).remove();
    }

    //etc
}
因此,不需要像SpringJ2EE应用程序那样将
PersonManager
注入控制器。相反,控制器只调用
Person.delete(x)

显然,当存在与外部系统的接口时,DI是有益的,因为具体的实现可以模拟用于测试等,但我看不到自包含的Play应用程序有多大好处


有谁有好的例子吗?是否有人使用它将
管理器
样式的类注入到
控制器
s中,以便在同一事务中执行许多操作,例如?

它再次表明,只有在您真正受益的情况下,才应该使用依赖项注入。如果您有复杂的服务,它是有用的,但在许多情况下不是。阅读中有关模型的章节

因此,给你一个例子,你可以使用DI与游戏。也许您必须进行复杂的计算,或者使用报表引擎创建pdf。在那里,我认为DI是有用的,特别是用于测试。在这里,我认为guice模块和spring模块非常有用,可以帮助您


NielsDI并不是适用于任何地方的最终解决方案。。。不要仅仅因为你手中有DI就使用它。。。在游戏中,您不需要DI来开发控制器/模型等。。。但有时这可能是一个很好的设计:在我看来,如果您有一个具有众所周知的接口的服务,您可以使用它,但您希望在游戏外开发此服务,并在游戏外测试它,甚至只使用一个虚拟服务来测试您的游戏项目,以便不依赖于完整的服务实现。因此,DI可能会很有趣:您可以将服务松散地插入其中。事实上,这是DI afaik的原始用例…

我相信从你写的这句话中:

有没有人有好的例子?有没有人用它向控制器中注入一个管理器样式的类,以便在同一个事务中执行许多操作

在回答DI问题之前,我应该注意一点:事务由Play自动管理。如果选中,您将看到事务在请求开始时自动创建,并在请求结束时提交。您可以通过JPA回滚它,或者在引发异常时回滚它

我提到这一点是因为从你句子的措辞来看,我不确定你是否意识到这一点

现在,关于DI本身,在我的(不太广泛的)DI经验中,我看到它主要用于:

  • 加载ORM(Hibernate)工厂/管理器
  • 将服务类/DAO加载到另一个类中以使用它们
当然,还有更多的场景,但这些场景可能涵盖了大部分实际使用情况。现在:

  • 第一个与游戏无关,因为您可以自动访问JPA对象和事务
  • 第二个方法也很不相关,因为您主要使用控制器中的静态方法。您可能有一些需要实例化的助手类,有些甚至可能属于层次结构(公共接口),因此DI将是有益的。但您也可以创建您赢得的工厂类,并摆脱DI的罐子

这里有另外一件事要考虑:我对Guice不太确定,但是Spring不仅仅是DI,它还提供了很多依赖于DI模块的额外功能。所以,也许你不想在游戏中使用DI,但你想利用Spring工具,他们将使用DI,尽管是间接的(通过xml配置)。

我刚刚写了一篇关于使用Google Guice设置游戏框架应用程序的博文


我看到了一些好处,尤其是当应用程序的某个组件需要基于特定上下文或类似内容的不同行为时。但是我认为人们应该对进入DI环境的内容进行选择。

我对静态初始化方法的拙见就是这个问题!这使得测试更难。一旦您使用承载HTTP消息数据(请求和响应)的静态成员和对象来解决HTTP与面向对象的问题,您就需要通过使对象与其余项目类松散耦合的能力,为每个请求创建新实例

不同设计的一个很好的例子是,它也扩展了基类,但它通过创建一个实例来解决问题(默认情况下,)

我相信这两种方法的混合可能会更好,每个控制器都有一个单例,这将提供完整静态类的相同特性,并允许对某些类型的对象进行依赖注入。但不是具有请求或会话范围的对象,一旦控制器需要创建每个新请求。此外,它还可以通过反转依赖注入的控制来提高可测试性,从而允许任意注入点

依赖项将由容器或测试注入,可能会使用mock来模拟以前可能已经测试过的重东西

在我看来,这种静态模型会让开发人员远离测试控制器,因为扩展会启动应用程序服务器,从而付出沉重的代价,比如存储库、服务、爬虫、http客户端、,我不想等待很多对象被引导,只是为了检查控制器上是否执行了一些代码