Dependency injection PlayFramework:控制器和依赖项注入之间的关系

Dependency injection PlayFramework:控制器和依赖项注入之间的关系,dependency-injection,playframework,controller,Dependency Injection,Playframework,Controller,现在我正在阅读PlayFramework的官方文档,该文档对DI进行了如下解释 有两种方法可以让游戏使用依赖注入控制器 我无法想象它们是如何联系在一起的,那么它们是什么意思呢? 为什么我们需要在控制器中加入DI的概念? 有人能解释一下吗?在早期版本的Play中,控制器有静态方法。这反过来会导致大量静态代码或单例,因为静态控制器无法轻松共享代码或服务对象。这也使得测试变得更加困难 通过转移到依赖注入控制器,现在一切都可以基于对象(代替早期基于类的方法),因此共享实例或专用代码可以传递到控制器中 想

现在我正在阅读PlayFramework的官方文档,该文档对DI进行了如下解释

有两种方法可以让游戏使用依赖注入控制器

我无法想象它们是如何联系在一起的,那么它们是什么意思呢? 为什么我们需要在控制器中加入DI的概念?
有人能解释一下吗?

在早期版本的Play中,控制器有静态方法。这反过来会导致大量静态代码或单例,因为静态控制器无法轻松共享代码或服务对象。这也使得测试变得更加困难

通过转移到依赖注入控制器,现在一切都可以基于对象(代替早期基于类的方法),因此共享实例或专用代码可以传递到控制器中

想象一个管理某种类型项目的应用程序。项目存储在数据库中,因此需要进行一些配置

public class StaticController extends Controller {
    // active record approach
    public static Result getItems() {
        // static call to Item
        List<Item> items = Item.findAll();
        // do other stuff
    }
}

因为
ItemDao
可以作为一个接口,所以耦合大大减少,测试也就简单多了。

谢谢。即使我们使用静态控制器方法,我们也可以像工厂方法一样使用它。我的意思是我们可以编写
List items=items.use()。如果我这样实现,应用程序有什么问题?通常我采用这种方法,因此与这种方法相比,我想知道使用DI的方法的优点。这种方法没有什么“错误”,但是
Items。use()
仍然是一个静态调用,因此很难测试,即使它返回某个实例。通过这种方法,您还可以添加一个额外的层,而不仅仅是将
项表示的对象直接注入控制器。通过允许每个请求一个对象的方法,它还允许您更容易地控制范围。如果您使用的是actors,您还可以将ActorRefs注入控制器,因为在actors上调用静态方法是毫无意义的。我原以为这个问题已经解决了,但现在发生了一些不确定的事情。最初,控制器本身是不可测试的,所以我有时采用selenium来测试它。但是你说Play将DI的概念引入到了控制器中,使测试更容易。在通常情况下,当使用依赖注入控制器时,如何测试控制器
public class InjectedController extends Controller {
    private final ItemDao itemDao;

    public InjectedController(final ItemDao itemDao) {
        this.itemDao = itemDao;
    }

    public Result getItems() {
        // static call to Item
        List<Item> items = itemDao.findAll();
        // do other stuff
    }
}