Shaun Mccran

My digital playground


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.

view plain print about
1<cffunction name="onApplicationStart">
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)>

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.

view plain print about
1<cffunction name="onFuseboxApplicationStart">
2    <cfset super.onFuseboxApplicationStart() />
3<!--- scope out all the objects as application level vars --->
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)>

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

view plain print about
1<cfset FUSEBOX_PARAMETERS.mode = "development-full-load">
3<cfset FUSEBOX_PARAMETERS.mode = "production">

Comments (Comment Moderation is enabled. Your comment will not appear until approved.)
Rob Dudley's Gravatar Nice post but I do have one question. Surely defining your Objects in the application scope will result in these objects becoming singletons? Therefore whenever I refer to application.mycfc I'm not using a short cut but an actual instantiated CFC with existing properties etc?

Is this correct or am I getting the wrong end of the stick?

# Posted By Rob Dudley | 29/03/2010 11:49
Rob Dudley's Gravatar Ok, have had a quick play on my dev server and can confirm that this does indeed create a full instatiated object whose properties (if set) persist ... for a while at least.

Oddly enough, the properties for the object seem to vanish after a while although the object remains in place.

Caching maybe?
# Posted By Rob Dudley | 29/03/2010 12:17
Shaun McCran's Gravatar Hi,
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 ( 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.
# Posted By Shaun McCran | 29/03/2010 12:29
Back to top