|
Pre loading object (CFC) references in your Application.cfc |
One of the best practices that I've been using more and more is ColdFusion's ability to add CFC object references to scopes. By this I mean that it is possible to create a shorter friendlier scoped variable that you use to reference your CFC's.
In your Application.cfc you can map out all your CFC references, this gives you a much shorter variable name to type each time, and it caches the CFC.
2
3<!--- scope out all the objects as application level vars --->
4<cfset application.formObj= createObject('component','dir.objName ')>
5<cfset application.siteObj= createObject('component','dir.objName')>
6<cfset application.mailObj= createObject('component','dir.objName')>
7<cfset application.config=createObject('component','dir.objName').getConfig(id=N)>
8
9</cffunction>
Put any references like this in the 'onApplicationStart' function. You do not need to lock the scope in this function, and if the code within it does not run successfully then it does not continue running the application. It will try again on the next page request.
The caching functionality here is great, not only will Coldfusion create a handy short name for CFC, but it will actually run through the code, and stop on any errors. If you deliberately introduce a code error into one of your objects you will see the Application halt and show you the error. For me this is reason enough to move all my business logic into CFC's. This essentially means that it is not possible for a user to get part of the way through a application and find an object based error.
Using this in conjunction with a framework such as FuseBox allows you to load, parse and cache the CFC object, all before your actual display layer has been invoked.
The example below uses the FuseBox function 'onFuseboxApplicationStart' of starting an Application.
2 <cfset super.onFuseboxApplicationStart() />
3<!--- scope out all the objects as application level vars --->
4
5<cfset application.formObj= createObject('component','dir.objName ')>
6<cfset application.siteObj= createObject('component','dir.objName')>
7<cfset application.mailObj= createObject('component','dir.objName')>
8<cfset application.config=createObject('component','dir.objName').getConfig(id=N)>
9
10
11</cffunction>
Changing the 'fusebox_parameters.mode' value allows you to set this caching at an environmental level, so no caching for development, or caching for live
2Or
3<cfset FUSEBOX_PARAMETERS.mode = "production">
Is this correct or am I getting the wrong end of the stick?
Rob
Oddly enough, the properties for the object seem to vanish after a while although the object remains in place.
Caching maybe?
Yes, you are correct they are classed as 'singletons', althought the method of managing their singularity in Coldfusion kind of means that they are only pseudo singletons, IE because you are only creating them in one place they become singletons.
Coldfusion design patterns (http://www.coldfusiondesignpatterns.org/wiki/Singl...) goes into a lot more depth on instantiating them through either global scopes (like in this article) or through a handler. I like the handler concept for the decoupling from the application scope, but I don't see any real issue with including them in this.
I guess the term 'short cut' is misleading, its just less to type really. But yes you are right, they all have existing properties once created, and to refresh them after code changes you need to reinit the App scope.