キャッシュ先の実際のスコープ構造を渡さないようにしたいというあなたの願望を理解していますが、選択肢は限られています。最初に頭に浮かぶのは、キャッシュを保存するスコープの名前(文字列)を渡して評価することです。その性質上、評価は非効率的であり、避ける必要があります。そうは言っても、私はそれがどのように達成されるのか興味がありました。私はあなたのコードを持っていないので、ここで単純な「ストレージ」抽象化CFC(テストしたいものとは無関係なので、キャッシュをスキップしました)を作成しました。
cache.cfc:
<cfcomponent>
<cfset variables.cacheScope = "session" /><!--- default to session --->
<cfset variables.cache = ""/>
<cfscript>
function init(scope){
variables.cacheScope = arguments.scope;
return this;
}
function cacheWrite(key, value){
structInsert(evaluate(variables.cacheScope),arguments.key,arguments.value,true);
return this;
}
function cacheRead(key){
if (not structKeyExists(evaluate(variables.cacheScope), arguments.key)){
return "";
}else{
variables.cache = evaluate(variables.cacheScope);
return variables.cache[arguments.key];
}
}
</cfscript>
</cfcomponent>
そしてそれをテストするためのビュー:
<!--- clear out any existing session vars --->
<cfset structClear(session)/>
<!--- show empty session struct --->
<cfdump var="#session#" label="session vars">
<!--- create storage object --->
<cfset cacher = createObject("component", "cache").init("session")/>
<!--- store a value --->
<cfset cacher.cacheWrite("foo", "bar")/>
<!--- read stored value --->
<cfset rtn = cacher.cacheRead("foo")/>
<!--- show values --->
<cfdump var="#rtn#">
<cfdump var="#session#" label="session vars">
トピック外:jQueryのようなメソッド呼び出しを連鎖できるように、[これ]を返すセッター関数を作成するのが好きです(上記を参照)。ビューの一部は、次のように簡単に記述できます。
<cfset rtn = createObject("component", "cache")
.init("session")
.cacheWrite("foo", "bar")
.cacheRead("foo")/>
これが可能であるのは興味深いことですが、Evaluateのオーバーヘッドコストのため、おそらく本番環境では使用しません。これは、キャッシュしたいスコープを渡すのに十分な理由だと思います。
それでも気になる場合は(そしておそらくそうですか?)、目的のスコープからの読み取りと書き込みを抽象化する別のCFCを作成し、それをストレージの場所としてキャッシュCFCに渡すことができます(ColdSpringに最適なタスク) 。 、そうすれば、キャッシュを別のスコープに移動することにした場合、初期化に「セッション」を渡すキャッシュCFCを使用して300ページをすべて編集する必要はなく、代わりに1つのCFCまたはColdSpring構成を編集できます。
リクエストスコープがあるのに、なぜシングルリクエストキャッシングが必要なのか完全にはわかりません。あなたが探しているのが現在のリクエストのために何かをキャッシュし、すぐにそれを死なせる方法であるなら、リクエストスコープはあなたが望むものかもしれません。キャッシングは通常、複数のリクエストにまたがる場合に価値があります。