我正在使用VMC创建一个站点,并使用bean将数据从Model传输到Controller/Views.
我计划实现一些基本的和非常简单的缓存,如果它们没有改变,将把bean存储在一个简单的结构中(随着使用量的增长,我们将在1.3版本周围实现更好的缓存系统).
所以问题在于我们的bean中的内容.
一种类型的bean只能保存基本数据,并依赖一些外部服务来完成剩下的工作(联系DAO获取查询,解析查询以加载bean值).这是一个"贫血豆"模型,因为我被一位同事反复告知:-).
另一种类型的豆将更加独立.它会知道DAO在哪里会直接调用DAO来获取数据查询.它将包含解析查询和设置属性所需的函数.它基本上将"服务"层的大部分与bean结合起来,将直接数据库留在DAO层中.
当然,对于控制器/视图,两个bean的外观和行为都相同.
但问题是内存以及ColdFusion/Java如何处理它.
使用贫血模型,bean只需要足够的内存来保存属性变量,只需触摸一下即可让它在需要时指向服务.
使用第二类bean中较重的函数,它会占用更多内存吗?bean的每个副本都有这些方法的完整副本吗?
我倾向于认为第二个模型不会有更多的内存,因为它们会"共享"这些方法,并且只需要内存用于属性变量.
恕我直言,第二种方法将简化代码库,因为bean需要的代码将更接近bean而不是分散在DAO和Services之间.它会减少服务中的简单函数,只需传递对bean的DAO的调用就可以在需要时直接转到DAO ......
这个问题有意义吗?或者至少我是怎么回事?
我正在将旧网站转换为CF 10,并想提出一些我的帮助代码.
代码查看查询,查找我们实例中的内容,并填充它们:
<cffunction name="populateSelf">
<cfargument name="source" type="query" required="yes" />
<cfif arguments.source.recordcount EQ 1>
<cfloop list="#arguments.source.columnlist#" index="local.col">
<cfif structKeyExists(variables.instance, local.col)>
<cfset variables.instance[local.col] = arguments.source[local.col]) />
</cfif>
</cfloop>
</cfif> <!--- one record? --->
</cffunction>
Run Code Online (Sandbox Code Playgroud)
我已经structKeyExists(variables.instance, local.col)使用'getMetaData()' 替换了我们当前属性的方便评估,但我在下一行遇到问题:<cfset variables.instance[local.col] = arguments.source[local.col]) />
如果我将其更改为<cfset this[local.col] =arguments.source[local.col] />,则忽略隐式setter并将结果放在此范围内...
为了尝试调用我们的setter,我尝试了这段代码:
<cfset setValue =arguments.source[local.col] />
<cfset evaluate("set#local.col#('#setValue#')" />
Run Code Online (Sandbox Code Playgroud)
但这似乎很复杂且容易出错(必须在字符串中转义任何"'").
使用查询加载部分或全部CFC属性的最佳方法是什么,而不必显式调用this.setPROPERTYNAME(query.COLUMN)可能的几十次????