MG1.1からMG:Unityへのアップグレード(その1)
ModelGlue:UnityによるCFアプリケーション開発の慣らし運転として、ModelGlue1.1ベースで作成されたサンプルアプリケーションをModelGlue:Unityにアップグレードしてみます。
選定するサンプルアプリケーションは、以前の記事で紹介したBrian Kotekのmgbookstorereactor。DIにColdspringを、ORMにReactorを使用しているので、ModelGlue:Unityへの移行ポイントがつかみやすいと思います。
移行ポイントは、以下の3点になります。
- Coldspring.xmlによる依存性注入パラメータの集中管理
- ormAdaptorとormServiceによるORM選択(Reactor/Transfer)
- 各種コントローラからinit()メソッドの削除
1点目の’Coldspring.xmlによる依存性注入パラメータの集中管理’とは、ModelGlue.xmlとReactor.xml内のConfigディレクティブを、Coldspring.xmlに移すということです。
最初に、ModelGlue.xml内のconfigディレクティブをカットし、Coldspring.xmlにペーストしてから、autowireControllers属性を削除します。
■ModelGlue.xml(ModelGlue1.1)
<config>
<setting name="beanMappings" value="/mgbookstorereactor/config/Coldspring.xml" />
<setting name="viewMappings" value="/mgbookstorereactor/views/pages,/mgbookstorereactor/views/layouts,/mgbookstorereactor/views/sidebarblocks" />
<setting name="reload" value="true" />
<setting name="defaultEvent" value="home" />
<setting name="applicationMapping" value="/mgbookstorereactor" />
<setting name="modelGlueMapping" value="/ModelGlue" />
<setting name="beanFactoryLoader" value="ModelGlue.Core.ColdSpringLoader" />
<setting name="defaultExceptionHandler" value="exception" />
<setting name="debug" value="true" />
<setting name="statebuilder" value="ModelGlue.Util.GenericCollection" />
<setting name="reloadKey" value="init" />
<setting name="reloadPassword" value="true" />
<setting name="statePrecedence" value="form" />
<setting name="eventValue" value="event" />
<setting name="defaultTemplate" value="index.cfm" />
<setting name="defaultCacheTimeout" value="5" />
<setting name="autowireControllers" value="true" />
</config>
■ColdSpring.xml(ModelGlue:Unity)
<!-- This is your Model-Glue configuration -->
<bean id="modelGlueConfiguration" class="ModelGlue.unity.framework.ModelGlueConfiguration">
<!-- Be sure to change reload to false when you go to production! -->
<property name="reload"><value>true</value></property>
<!-- Rescaffold is overridden by reload - if reload is false, rescaffold's setting doesn't matter -->
<property name="rescaffold"><value>true</value></property>
<!-- Be sure to change debug to false when you go to production! -->
<property name="debug"><value>true</value></property>
<property name="defaultEvent"><value>home</value></property>
<property name="reloadPassword"><value>true</value></property>
<property name="viewMappings"><value>/mg2test/views,/mg2test/views/pages,/mg2test/views/layouts,/mg2test/views/sidebarblocks</value></property>
<property name="generatedViewMapping"><value>/mg2test/views/generated</value></property>
<property name="configurationPath"><value>config/ModelGlue.xml</value></property>
<property name="scaffoldPath"><value>config/scaffolds/Scaffolds.xml</value></property>
<property name="statePrecedence"><value>form</value></property>
<property name="reloadKey"><value>init</value></property>
<property name="eventValue"><value>event</value></property>
<property name="defaultTemplate"><value>index.cfm</value></property>
<property name="defaultExceptionHandler"><value>exception</value></property>
<property name="defaultCacheTimeout"><value>5</value></property>
<property name="defaultScaffolds"><value>list,edit,view,commit,delete</value></property>
</bean>
次に、Reactor.xml内のconfigディレクティブをカットし、ColdSpring.xml内のreactorConfigurationビーンのプロパティに定義します。
■Reactor.xml(ModelGLue1.1)
<config>
<dsn value="Test" />
<type value="mysql4" />
<mapping value="/mgbookstorereactor/data/" />
<mode value="always" />
<project value="mgbookstorereactor" />
</config>
■ColdSpring.xml(ModelGlue:Unity)
<bean id="reactorConfiguration" class="reactor.config.config">
<constructor-arg name="pathToConfigXml"><value>/mg2test/config/reactor/Reactor.xml</value></constructor-arg>
<property name="project"><value>mg2test</value></property>
<property name="dsn"><value>Test</value></property>
<property name="type"><value>mysql4</value></property>
<property name="mapping"><value>/mg2test/model/data/reactor</value></property>
<property name="mode"><value>production</value></property>
</bean>
2点目の’ormAdaptorとormServiceによるORM選択(Reactor/Transfer)’とは、ormAdaptorとormServiceとしてReactorをAlias指定することと、reactorFactoryからormServiceに変更します。また、ControllerであるProductManager.cfc内のreactorFactoryをすべてormServiceに置換します。
■Coldspring.xml(ModelGLue1.1)
<bean id="reactorFactory" class="reactor.reactorFactory">
<constructor-arg name="configuration">
<value>/mgbookstorereactor/config/reactor.xml</value>
</constructor-arg>
</bean><bean id="productGateway" factory-bean="reactorFactory" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>product</value>
</constructor-arg>
</bean><bean id="productDAO" factory-bean="reactorFactory" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>product</value>
</constructor-arg>
</bean><bean id="orderGateway" factory-bean="reactorFactory" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>order1</value>
</constructor-arg>
</bean>
■ColdSpring.xml(ModelGLue:Unity)
<alias alias="ormAdapter" name="ormAdapter.Reactor" />
<alias alias="ormService" name="ormService.Reactor" /> <bean id="productGateway" factory-bean="ormService" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>product</value>
</constructor-arg>
</bean><bean id="productDAO" factory-bean="ormService" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>product</value>
</constructor-arg>
</bean><bean id="orderGateway" factory-bean="ormService" factory-method="createGateway">
<constructor-arg name="objectAlias">
<value>order1</value>
</constructor-arg>
</bean>
3点目の’各種コントローラからinit()メソッドの削除’とは、すべてのControllerからinit()メソッドを削除することです。
■CartManager.cfc(ModelGlue1.1)
<cffunction name="init" access="public" returntype="CartManager" output="false" hint="Shopping cart Constructor.">
<cfargument name="ModelGlue" required="true" type="ModelGlue.ModelGlue" />
<cfargument name="InstanceName" required="true" type="string" />
<cfset super.init( arguments.ModelGlue ) /><cfset variables.instance.cartFactory= structNew() />
<cfreturn this />
</cffunction><cffunction name="OnRequestStart" access="Public" returntype="void" output="false" hint="I am an event handler.">
<cfargument name="event" type="ModelGlue.Core.Event" required="true">
<cfif not structKeyExists( session, 'cart' )>
<cflock scope="session" timeout="10" type="exclusive">
<cfset session.cart = getCartFactory().getCart() />
</cflock>
</cfif>
</cffunction>
■CartManager.cfc(ModelGlue:Unity)
<cffunction name="OnRequestStart" access="Public" returntype="void" output="false" hint="I am an event handler.">
<cfargument name="event" type="ModelGlue.Core.Event" required="true">
<cfif not structKeyExists( session, 'cart' )>
<cflock scope="session" timeout="10" type="exclusive">
<cfset session.cart = getCartFactory().getCart() />
</cflock>
</cfif>
</cffunction>
mgbookstorereactorのModelGlue1.1版はこちら、ModelGlue:Unity版はこちらです。
コメント