本節對Tuscany擴展中的Interface,DataBinding進行了探討,說明了兩種實現的目的以及如何進行擴展。Interface對提供的service進行接口的描述,服務元模型的一種描述方式,在使用是會對調用的服務進行接口匹配,來保證調用的服務的操作與服務定義的接口相一致。DataBinding提供了數據的轉換機制,能夠把業務數據按正確的方式傳遞給Component進行調用,通過實現接口DataBinding和Transformer來完成。
3、 擴展Interface
Interface擴展相對于implementation,binding來講,是相對簡單一點的擴展方式,對提供的service進行接口的描述,提供服務元模型的一種方式。Interface在使用是會對調用的服務進行接口匹配,來保證調用的服務的操作與服務定義的接口相一致。
目前已實現的interface有Java,WebService1.1兩種方式。
擴展步驟如下:
a. 定義Interface上的擴展模型
b. 定義InterfaceContract的擴展接口,來擴展自己的屬性
c. 實現InterfaceContract接口,生成Interface的具體定義
d. 定義對Interface節點的解析器,實現接口StAXArtifactProcessor,并在其read方法中生成InterfaceContract實例。
e. 在ModuleActivator中注冊解析器,并在運行器中注冊
4、Databinding擴展
DataBinding提供了數據的轉換機制,能夠把業務數據按正確的方式傳遞給Component進行調用,通過實現接口DataBinding和Transformer來完成。
DataBinding通過一字符中類型的ID進行區分,并且還可以為其指定別名,并且指定針對其ID所使用的一系列轉換器(Transformer),在使用過程中,會針對指定類型把一種數據類型轉換為另一種數據類型,實現接口數據的自動匹配。例如,我們定義了data1到data2數據類型的轉換器,那么在應用過程中,可以使用data1數據類型,也可以使用data2數據類型,框架會此進行判斷,并按轉換器定義的規則進行數據類型的轉換。
要擴展新的DataBinding實現,通常通過以下幾個步驟:
a. 擴展接口DataBinding,通常擴展抽象類BaseDataBinding就可以了
a) 定義DataBinding的唯一標識和別名
b) 處理操作的wrapping/unwrapping
c) 定義數據的copy方式,傳值引用,相于對象的clone
d) 定義正理異常的Handle
b. 增加轉換器,把databinding中指定的類型轉換到不同的類型數據上,在Tuscany中會把所有的Transformer放到一張拓撲圖中,根據拓撲圖能找到從源類型—>目標類型轉換的最短路徑。通過實現PullTransformer/PushTransformer接口來完成
a)接口定義了源和目標數據的類型以及其中的源到目標數據類型的轉換規則。
b)Transformer有兩種類型的接口PullTransformer/PushTransformer,其中有一點小小的區別,PushTransformer在數據轉換方法transform中比PullTransformer多了一個參數,來表明數據的接收點(The sink to receive the data),有點像管道流的作用。
下面以AxiomDataBinding轉換的示例,把字符串類型轉換為OMElement類型:
- public class String2OMElement extends BaseTransformer<String, OMElement> implements
- PullTransformer<String, OMElement> {
-
- @SuppressWarnings("unchecked")
- public OMElement transform(String source, TransformationContext context) {
- try {
- StAXOMBuilder builder = new StAXOMBuilder(new ByteArrayInputStream(source.getBytes()));
- OMElement element = builder.getDocumentElement();
- AxiomHelper.adjustElementName(context, element);
- return element;
- } catch (Exception e) {
- throw new TransformationException(e);
- }
- }
-
- public Class getTargetType() {
- return OMElement.class;
- }
-
- public Class getSourceType() {
- return String.class;
- }
-
- public int getWeight() {
- return 40;
- }
-
- }
c、DataBinding加載
其實現方式同Implementation,Binding,Interface,通過實現ModuleActivator接口完成。
DataBinding的類圖如下:
資源列表:
Spec:http://www.osoa.org/display/Main/Home
Tuscany Home:http://cwiki.apache.org/TUSCANY/
Tuscany Code:https://svn.apache.org/repos/asf/incubator/tuscany/java/sca
(全文完)