ColdBox using ColdSpring
The more I work in ColdBox the more I want to learn, so pardon my ramblings but yesterday ColdBox and ColdSpring took my fancy. I have never worked with ColdSpring nor any other AOP for CFC's.
So ColdSpring, what's all that about then? To be honest I am still not sure why I would use it. I started by playing around, I wanted to inject my ColdBox DNS setting into my common.cfc (database gateway).
2 <bean id="coldboxFactory" class="coldbox.system.extras.ColdboxFactory" />
3 <bean id="ConfigBean" factory-bean="ColdboxFactory" factory-method="getConfigBean" />
4 <bean id="dsnBean" factory-bean="ColdboxFactory" factory-method="getDatasource">
5 <constructor-arg name="alias">
6 <value>DBDetails</value>
7 </constructor-arg>
8 </bean>
9 <bean id="userService" class="model.UserService" />
10
11 <bean id="userGateway" class="model.common" >
12 <property name="dsnBean">
13 <ref bean="dsnBean" />
14 </property>
15 </bean>
16
17 </beans>
I then created a UserService.cfc. The idea I think behind this is that I access the userService.cfc to get to common.cfc (gateway) and common.cfc gets the DNS setting injected.
2
3 <cffunction name="init" access="public" returntype="any" hint="Constructor.">
4 <cfreturn this />
5 </cffunction>
6
7 <cffunction name="getUserGateway" access="public" returntype="any" output="false" hint="Return the UserGateway.">
8 <cfreturn variables.instance['userGateway'] />
9 </cffunction>
10
11 <cffunction name="setUserGateway" access="public" returntype="void" output="false" hint="Set the UserGateway.">
12 <cfargument name="userGateway" type="any" required="true" hint="UserGateway" />
13 <cfset variables.instance['userGateway'] = arguments.userGateway />
14 </cffunction>
15 </cfcomponent>
2 <cffunction name="setdsnBean" access="public" returntype="void" output="false" hint="Set the dsnBean.">
3 <cfargument name="dsnBean" type="any" required="true" hint="dsnBean" />
4 <cfset variables.instance['dsnBean'] = arguments.dsnBean />
5 </cffunction>
Why is this any better? I could have achieved this all in the init() method without ColdSpring, or I could have extended my CFC, or I could have even created a config CFC and injected that into the common.cfc.
Sorry, If these questions are just ignorant.




Wouldn't it be better to inject the dsn (string) directly into UserGateway?
Read this: http://www.coldspringframework.org/coldspring/exam...
Let's say you have a UserService that requires a UserValidator object. You could just createObject() within UserService.init() or call some kind of factory (application.beanFactory.getBean("UserValidator").
In the first case, as the complexity of the config settings for UserValidator grows, you need to maintain that in your UserService code (all the properties you need to pass to the init() constructor, etc).
In the second case, you've put all the knowledge about creating beans into one factory to make it easy to maintain, but you're still calling the application scope, so there is no easy way to mock/stub out the UserValidator implementation in your unit tests for the UserService.
If all this sounds like double dutch, you may not need a DI engine like ColdSpring or LightWire right now. Once you notice that you're having problems writing unit tests for your objects or with the complexity of the initialization of your cfc's all over the place, time to come back and have another look!
Peter