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