作者:
www.mach-ii.Info 译者: Franks
具体的 filter 的例子可以在 mach-ii.info 范例中得到。
1.在哪里放置作用域为application的变量(比如dsn)?
对于简单字符串,可以在mach-ii.xml文件中的<property>标签里定义。你可以通过getProperty()方法,在filter/listener/plugin/view中访问它们。
<cfset dsn = getProperty("dsn") />
那些需要在运行时计算的复杂数据则可以通过plugin初始化参数再用setProperty()方法来触发。比方说,你可以使用一个bean来储存应用程序常数。这样的bean看上去像这样:
<cfcomponent displayName="ApplicationConstantsBean" hint="An application constants bean.">
<!--- CONSTRUCTOR --->
<cffunction name="init" access="public" returntype="ApplicationConstantsBean" output="false" >
<cfargument name="dsn" type="string" required="false" default="" />
<cfset variables.instance = structNew() >
<cfset setdsn(arguments.dsn) />
<cfreturn this />
</cffunction>
<!--- GETTERS/SETTERS --->
<cffunction name="getdsn" access="public" returntype="string" output="false">
<cfreturn variables.instance.dsn />
</cffunction>
<cffunction name="setdsn" access="public" returntype="void" output="false">
<cfargument name="dsn" type="string" required="true" />
<cfset variables.instance.dsn = arguments.dsn />
</cffunction>
</cfcomponent>
<!--- CONSTRUCTOR --->
<cffunction name="init" access="public" returntype="ApplicationConstantsBean" output="false" >
<cfargument name="dsn" type="string" required="false" default="" />
<cfset variables.instance = structNew() >
<cfset setdsn(arguments.dsn) />
<cfreturn this />
</cffunction>
<!--- GETTERS/SETTERS --->
<cffunction name="getdsn" access="public" returntype="string" output="false">
<cfreturn variables.instance.dsn />
</cffunction>
<cffunction name="setdsn" access="public" returntype="void" output="false">
<cfargument name="dsn" type="string" required="true" />
<cfset variables.instance.dsn = arguments.dsn />
</cffunction>
</cfcomponent>
之后,你的plugin配置方法可以初始化这个bean,并将它设置为框架的参数:
<cffunction name="configure" access="public" returntype="void" output="false">
<cfscript>
variables.appConstants=createObject
("component","machii_info.model.applicationConstantsBean").init(
dsn="machii_info");
setProperty("appConstants",variables.appConstants);
</cfscript>
</cffunction>
<cfscript>
variables.appConstants=createObject
("component","machii_info.model.applicationConstantsBean").init(
dsn="machii_info");
setProperty("appConstants",variables.appConstants);
</cfscript>
</cffunction>
第三步
,listener
可以像这样在配置中使用这个
bean
:
<cffunction name="configure" access="public" returntype="void" output="false" >
<cfscript>
var appConstants = getProperty("appConstants");
variables.dsn = appConstants.getDsn();
variables.myGateway = createObject("component","cfcpath.myGateway").init(dsn);
</cfscript>
</cffunction>
<cfscript>
var appConstants = getProperty("appConstants");
variables.dsn = appConstants.getDsn();
variables.myGateway = createObject("component","cfcpath.myGateway").init(dsn);
</cfscript>
</cffunction>
同样的
,
你的
view
可以得到
appConstants
:
<cfscript> appConstants = getProperty('appConstants');</cfscript>
注意
,
这个例子时使用
bean
来封装应用程序变量的
,
你也可以通过结构体或其他复杂数据来达到目的。
同样要注意,这个例子只适合1.0.10以上版本。
2.该如何在event handler中定义重定向(redirect/cflocation)?
不同于Fusebox 4在xml文件中使用<relocate>命令的方法,Mach-II没有这样的xml命令语法来实现重定向。你将需要执行filter,然后可以这样做:
<event-handler event="someEvent"
access="public">
<event-bean name="abean" type="com.domain.model.abean." />
<notify listener="someListener" method="update" />
<filter name="redirect" >
<parameter name="announceEvent" value="eventToRedirectTo" />
<parameter name="argsToCopy" value="anUrlParam" />
</filter>
</event-handler>
<event-bean name="abean" type="com.domain.model.abean." />
<notify listener="someListener" method="update" />
<filter name="redirect" >
<parameter name="announceEvent" value="eventToRedirectTo" />
<parameter name="argsToCopy" value="anUrlParam" />
</filter>
</event-handler>
具体的 filter 的例子可以在 mach-ii.info 范例中得到。
3.当mach-ii.xml文件越来越大的时候,性能会不会受到影响?
性能不会受大体积的xml文件多大影响。有很多大通行量的程序的mach-ii.xml文件包含多达1000行以上。xml文件只在启动时被读取一次,它的体积不会在运行时影响程序。
4.该如何载入用户自定义函数(UDFs)并在应用程序中访问它们呢?
与将包含应用程序常量的bean在prepertyManager中的存储方法类似,你可以将你的UDFs封装在组件并存储在prepertyManager中。
5.哪些好书有助于学习Mach-ii?
有几本不是专门讲解Mach-ii书可以推荐。里面有关于面向对象设计和模式的实质内容的讲解。包括
:
Applying UML and Patterns - (Craig Larman)
Design Patterns: Elements of Reusable Object-Oriented Software - (Eric Gamma et al.) The "Gang of Four" book.
Design Patterns Explained - (Alan Shalloway)
Head First Java - (Bert Bates, Kathy Sierra)
Java For ColdFusion Developers - (Eben Hewitt)
Design Patterns: Elements of Reusable Object-Oriented Software - (Eric Gamma et al.) The "Gang of Four" book.
Design Patterns Explained - (Alan Shalloway)
Head First Java - (Bert Bates, Kathy Sierra)
Java For ColdFusion Developers - (Eben Hewitt)
6
.
哪些服务器平台支持
Mach-II?
CFMX 6.1
以上版本支持
Mach-II
;
Mach-II
还可以运行于
BlueDragon 6.1 beta3
但有一下一些注意点
:
×
经常需要为
CFCs
使用满权限类型的名称
(
full qualified type names
××);
×
不要在
<cfscript>
标记里使用
return
,
而需要使用
<cfreturn/>
;
×当调用某个方法时,要保证传递了所有在方法中申明过的变量,甚至在这些变量不是必需的的情况下;
×如果变量尚未在
<cfargument>
中申明,请不要传递它们;
×不允许绝对类型转换(
implicit type conversion
),除非该明确的类型是现行类型的父类。用于PHP和Java的Mach-II目前还处于内部开发阶段,尚未公开测试。
7.为什么我要使用Mach-II代替Fusebox?
由于具有面向对象的本质,Mach-II可以更好地支持低耦合和高内聚的开发风格。这使得软件易于维护(和增强)。
做什么样的选择真正归结为开发者或者开发团队的风格。如果你或你的团队倾向于(或者希望了解更多)面向对象的设计和开发,Mach-II便是理想的选择。换句话说,如果你更喜欢面向过程的编程,则应选择Fusebox。
8.在虚拟主机(shared hosting)环境下,如何运行Mach-II?
如果你的主机已经将Mach-II安装在CF wwwroot目录下,你可以直接使用它。
如果不是这种情况,你需要将Mach-II安装到你的网站根目录下,然后请求主机做一个映射(mapping)到你的根目录。
如果不可以,你仍然可以把Mach-II安装在你的网站根目录下,不过将需要修改一下Mach-II内核文件:搜索并重置
“
Mach-II.
”
为
“
the.path.to.your.webroot.Mach-II
”
。
如果你使用Dreamweaver MX,你可以通过
“
find/replace
”
来更快捷地完成以上操作。
9.如何从监听器(listener)清除事件队列(event queue)?
clearEventQueue()是eventContext的一个方法。eventContext作为变量传递给filters和plugins,而不是listeners。因此,无法通过listener来完成清除工作。如上所述,eventContext可以在request作用域下被访问,但这不被推荐。这是框架内部执行的具体信息,而不打算提供给开发人员使用。
另一个选择就是执行自定义invoker来传递eventContect给listener方法。该途径在Mach-II邮件列表(×××)中有过讨论。
10.Filter和Listener有哪些不同点?如何决定使用的时机?
你可以在listener里修改事件对象,但不可以中断当前事件的触发,同样不可以在listener里清除事件队列。除了能力上的不同点,他们的用途也不同。listener专注于事件触发器和模型之间的相互作用,而filter则关注事件触发器和控制器之间的相互影响。