当前位置: 首页 > 知识库问答 >
问题:

PlayFramework Scala依赖注入Javax

邓昊天
2023-03-14

我是Scala和PlayFramework的新手,我正试图弄清楚如何进行依赖注入。我基本上想要一个将成为特征的文件,并将其注入控制器。我的问题是我的Controller类没有看到我的特性这是我的代码

个人资料性状

package traitss

import play.api.mvc._


trait ProfileTrait extends Controller {
    def Addone()
  }

然后我尝试将其注入我的控制器

import java.nio.file.{Files, Paths}

import traitss.ProfileTrait_
import play.api.mvc.{Action, Controller}
import javax.inject._

class Profiles @Inject() (profileTrait: ProfileTrait)   extends Controller
{

}

然而,我的控制器没有看到它,我试图按照这里的例子https://www . play framework . com/documentation/2.5 . x/ScalaDependencyInjection。我使用的是play framework版

共有2个答案

柴飞扬
2023-03-14

你不能注入一个特征,你必须注入一个实现该特征的对象。

要使依赖注入工作,您必须告诉框架(play在幕后使用Guice)如何解析要注入的依赖。有许多方法可以做到这一点,这取决于您的情况,有关更多详细信息,您可以查看Guice的文档,最简单的方法是将< code>Module.scala创建到您的< code>app目录中,如果它还不在那里的话,然后像这样放置:

import com.google.inject.AbstractModule
class Module extends AbstractModule {
  override def configure() = {
    bind(classOf[ProfileTrait]).toInstance( ... )
  }
} 

...中,您放置逻辑来创建要注入的对象。

司寇书
2023-03-14

你不能直接注入特性。您需要指定需要注入的特征的实现。

有两种方法可以指定要注入的特征的实现:

使用@ImplementedBy注释。下面是一个简单的示例:

package traitss

import play.api.mvc._
import com.google.inject.ImplementedBy

@ImplementedBy(classOf[ProfileTraitImpl])
trait ProfileTrait extends Controller {
    def Addone()
}

class ProfileTraitImpl extends ProfileTrait {
    // your implementation goes here
}

使用编程绑定

package traitss

import play.api.mvc._
import com.google.inject.ImplementedBy

@ImplementedBy(classOf[ProfileTraitImpl])
trait ProfileTrait extends Controller {
    def Addone()
}

ProfileTraitImpl:

package traitss.impl

class ProfileTraitImpl extends ProfileTrait {
    // your implementation goes here
}

创建一个可以将实现与trait绑定的模块

import com.google.inject.AbstractModule

class Module extends AbstractModule {
  def configure() = {

    bind(classOf[ProfileTrait])
      .to(classOf[ProfileTraitImpl])
  }
}

通过使用模块方法,您可以获得启用或禁用绑定的额外好处。例如,在application.conf文件中,您可以使用play.modules.enabled=模块ORplay.modules.disabled=模块启用/禁用模块

 类似资料:
  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper

  • 出自维基百科 Wikipedia: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 这句解释让依赖注入的概念听起来比它实际要复杂很多。依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。就是这么简单。

  • 主要内容:什么是依赖注入,value,factory,provider,constant,实例,AngularJS 实例 - factory,AngularJS 实例 - provider什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。 该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦

  • 我要的不是意见而是事实 我正在尝试选择一个新的DI。我有一些Guice的经验。总的来说,我想说它的一个优点是,当从scala需要与Java集成时,Guice可以完成这项工作。所以对于互操作性来说,这是一个明显的优势。 如果我们抛开这个互操作性问题不谈,谁能给我简单的比较一下 scaladi,guice,Macwire? 我对了解烫伤症还是新手。我发现令人惊讶的一件事是必须通过隐式参数在喷油器周围移

  • 问题内容: 我想知道接下来的两行之间是否有区别,为什么要使用其中之一(这两行按预期工作) 我是从AngularJS官方教程中获得的,我知道有关于此修改的解释,但我不理解它…… http://docs.angularjs.org/tutorial/step_05 提前致谢! 问题答案: 如果缩小第一行,则会得到: 依赖注入将无法再工作,因为角度不知道什么和有。比较一下以缩小第二个版本: 该函数的参数