【问题标题】:Coldbox getSetting in a model wirebox injection模型线箱注入中的冷箱 getSetting
【发布时间】:2014-04-11 23:46:52
【问题描述】:

我正在尝试在模型中访问 Coldbox getSetting

在文档和 Coldbox Google Group 帖子中,它明确指出

模型是您应用程序的一个完全隔离的层,没有 除非您将依赖项注入其中,否则可以访问任何 ColdBox。 我们建议您查看我们的 WireBox 依赖注入,以便您了解 如何为模型注入他们需要的东西。

他们指向这个文档:http://wiki.coldbox.org/wiki/WireBox.cfm#The_WireBox_Injector

但除了有些令人困惑的文档和 Google Group 帖子重复上述引用之外,没有真正的好例子说明如何做到这一点。

我尝试在模型顶部进行属性注入:

<cfcomponent displayname="myComponent" output="false">
    <cfproperty name="mySetting" inject="coldbox:setting:mySetting" />
       <cffunction name="myFunction" output="false" hint="index"> 
          <cfset value = getProperty('mySetting') />
           ...

这会返回错误消息:Variable GETPROPERTY is undefined.

我还尝试在我的模型函数中注入参数,但我知道那行不通。

<cffunction name="myFunction" output="false" hint="index">
  <cfargument name="mySetting" inject="coldbox:setting:mySetting">

谁能告诉我如何通过线盒注入或任何方法将getSetting 传递给模型?

如何在 Coldbox 模型中注入依赖项?

【问题讨论】:

    标签: coldfusion dependency-injection coldbox wirebox


    【解决方案1】:

    您的注射看起来不错。问题是您正在尝试使用组件中未定义的“getProperty()”。它来自框架超类型,仅存在于框架对象中,如处理程序等。属性注入默认情况下将对注入对象的引用直接放入“变量”范围,因此您只需将其作为 variables.mySetting 访问。

    您还可以使用 scope 属性控制属性注入的范围:

    http://wiki.coldbox.org/wiki/WireBox.cfm#Property_Annotation

    参数注入确实有效,但仅适用于构造函数 (init),因为它们由 DI 引擎自动调用。

    此外,此参考卡可能比完整的 WireBox 文档更易于阅读,但它显然没有涵盖那么多信息: https://github.com/ColdBox/cbox-refcards/raw/master/WireBox/WireBox-Refcard.pdf

    免责声明:我是 ColdBox 团队的一员。

    【讨论】:

    • 我确实尝试使用 variables.mySetting,它抛出了一个错误 variables is undefined
    • 嗯,它确实突然开始为 variables.mySetting 工作,可能是缓存问题......也谢谢你的卡,会派上用场
    • 很高兴听到它的工作。请记住,即使接收注入的对象是瞬态的,您也需要重新初始化框架,因为映射的元数据缓存在 WireBox 中以提高性能。
    • 最后一个问题,如果我将它放置在wirebox 配置中而不是模型上的属性注入中,我将它放置在哪里?这是wirebox配置的要点,它现在只是默认的gist.github.com/Jrizzi1/10488828
    • 显式映射,如果您选择使用它们,请转到“// Map Bindings below”注释所在的位置。请参阅我在其他评论中留下的示例 WireBox 活页夹配置。
    【解决方案2】:

    /config/WireBox.cfc 中,您为模型对象设置别名:

    map('KungFooDAO').to('model.path.to.KungFooDAO');

    您可以在此处将 ColdBox 设置作为属性注入:

    map('KungFooDAO').to('model.path.to.KungFooDAO')
        .property(name='myDsn', dsl='coldbox:datasource:myDsn');

    现在,在KungFooDAO.cfc 内部,您可以引用variables.myDsn,它具有ColdBox 设置的值。

    或者,您可以在 WireBox 配置中取消 .property() 调用,并在 KungFooDAO.cfc 中添加一个 CFPROPERTY,如下所示:

    &lt;cfproperty name="myDsn" inject="coldbox:datasource:myDsn" /&gt;

    这些示例取自实时代码(DSN 名称已更改以保护无辜者)。

    您的 CFC 模型的 WireBox 条目是什么样的?

    【讨论】:

    • 我还没有放一个!我会在早上尝试这个第一件事。附言我很欣赏你的工作,使用你的几个来自 github 的插件
    • 在函数 configure(){wireBox = {}} 中我应该在哪里放置地图?
    • 映射 DSL 位于 configure() 方法内部,但位于“wirebox”结构声明之外。请参阅此示例:github.com/ColdBox/coldbox-samples/blob/master/applications/… 当然,请记住映射 DSL 是直接将注释和属性直接放入 CFC 的替代方法。两种手段达到同一目的。
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2015-04-28
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2018-04-15
    相关资源
    最近更新 更多