Почему инъекция зависимостей завершается неудачно в моем объекте фабрики CF? - PullRequest
1 голос
/ 19 июля 2009

Я получаю эту ошибку

Элемент INSTANCE не определен в переменных.

Не вижу причины ошибки!

Это моя фабрика

<cfcomponent output="true" displayname="ObjectFactory">

 <cffunction name="init" access="public" output="true" returntype="ObjectFactory">
  <cfset variables.instance = structNew() />
  <cfreturn this />
 </cffunction>

 <cffunction name="createObj" access="public" output="false" returntype="any">
  <cfargument name="objName" type="string" required="true" />
  <cfswitch expression="#arguments.objName#">
   <cfcase value="abstractCollection">
    <cfreturn createObject('component',"AbstractCollection").init() />
    <cfbreak />
   </cfcase>
   <cfcase value="assignmentCollection">
    <cfreturn createObject('component',"AssignmentCollection").init() />
    <cfbreak />
   </cfcase>
   <cfcase value="salesmanBean">
    <cfreturn createObject('component',"SalesmanBean").init(
     salesmanHasThisDecorations = this.getInstance("assignmentCollection")) />
    <cfbreak />
   </cfcase>
  </cfswitch>
 </cffunction>

 <cffunction name="getInstance" access="public" output="false" returntype="any">
  <cfargument name="objName" type="string" required="true" />
 <!--- Error occurs in the line below --->
  <cfif not structKeyExists(variables.instance, arguments.objName)>
   <cfset variables.instance[arguments.objName] = this.createObj(arguments.objName) />
  </cfif>
  <cfreturn variables.instance[arguments.objName] />
 </cffunction>
</cfcomponent>

Ответы [ 2 ]

4 голосов
/ 19 июля 2009

Убедитесь, что вы вызываете init () при создании экземпляра ObjectFactory:

<cfset objectFactory = CreateObject("component","ObjectFactory").init()>

К вашему сведению, init() и <cfcomponent> должны иметь output='false'

К вашему сведению, вы должны вызывать свою собственную функцию без "this.", Потому что если по какой-то причине функция позднее будет объявлена ​​как private, она не найдет ее в области действия "this".

0 голосов
/ 21 июля 2009

Согласитесь, что вы, вероятно, не вызываете .init (), поэтому не создаете переменную перед тем, как получить к ней доступ.

Вы также можете инициализировать (создать) переменные области VARIABLES вне init (). Функция init () должна использоваться в большей степени для передачи значений во внутреннюю область CFC (область VARIABLES), чем для создания в ней переменных.

<cfcomponent displayname="ObjectFactory">
<cfset variables.instance = structNew() />

 <cffunction name="init" access="public" returntype="ObjectFactory">
  <cfargument name="name" required="yes" type="string">
  <cfset variables.instance.name = arguments.name>
  <cfreturn this />
 </cffunction>

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...