2009年4月6日 星期一

U16 元件各自的Package與Properties設定

使用結構設計的元件最好是一個Package內只放一個Component,主要的原因當然是由於每個完整Component裡至少會有20個檔案,混雜了兩個以上元件的Package根本會令人不知道裡面的程式到底誰是誰的。而更重要的是多個元件對應到一個資料夾是多對一的關係,倘使元件的放置需要加以切割又會面臨到重組的問題。

有一個觀念必須釐清:並不是所有的功能單位都要設計為Component,有些實作適合以Class的形式存在(像是LogUtil與UI Bean),而包含較多邏輯性內容的功能偏向於包裝為Component(像是ApplLog)。Component會需要傳入參數來因應不同狀況下的處理方式,參數的來源有兩大類:呼叫方法時傳入(執行動作的參考狀態)與定義在元件用的參數檔(一般情況下的通用狀態)。

建議使用Bean File的形式來存放多個Component的參數設定,一個bean對應到一個Component設定並將ComponentID放到id的屬性裡。BeanFileDataModelInterface增加一個方法,在系統初始化時取出元件的Properties後放到所屬的Component以完成元件的初始化。
  public void getBeanProperties(String beanId, BasePropertiesInterface properties) throws BeanNotFoundException;

ApplLog元件使用程式初始化時需要有這些程式碼:
  ApplLogProperties properties = new ApplLogProperties();
  ((Properties) properties).setProperty(BasePropertiesInterface.CLASS_FLOW, "tw.idv.joying.component.appllog.ApplLogFlow");
  ((Properties) properties).setProperty(BasePropertiesInterface.CLASS_ACTION, "tw.idv.joying.component.appllog.ApplLogAction");
  properties.setLogLevel(LogUtil.INFO);
  ApplLog.getInstance().setApplLogProperties(properties);

將參數改存放到XML檔案會是這樣的形式:
<beans>
  <bean id="tw.idv.joying.component.appllog.ApplLog">
    <property name="classFlow" value="tw.idv.joying.component.appllog.ApplLogFlow" />
    <property name="classAction" value="tw.idv.joying.component.appllog.ApplLogAction" />
    <property name="logLevel" value="4" />
  </bean>
</beans>

針對ApplLog的初始化可以改寫成這樣:(ModelParser針對不同的檔案讀取設定可以包裝成一個通用API,只要傳入檔名與處理類型就能拿到資料物件)
  ApplLogProperties properties = new ApplLogProperties();
  beanFile.getBeanProperties(ApplLogInterface.COMPONENTID, properties);
  ApplLog.getInstance().setApplLogProperties(properties);

最後可以改寫初始化的程式碼,不再需要每個元件都準備自己的設定檔,只要使用固定的初始化方式就能夠集中管理所有元件的設定。處理原則在初始化元件時取得beanId,由於命名方式一致可以捨棄new的寫法而改用Class.forName()取得元件的Properties物件,並傳入到元件裡作初始化。如此一來也統一了元件的初始化設定功能。

註:這裡的內容並未實作在workspace裡,但是在之前的專案裡已驗證過可行。

沒有留言:

張貼留言