2010-07-05 51 views
2

發佈我的示例類:如何構建具有依賴關係的OSGi服務,並且經由DS

public class MyModel implements Model 
{ 
    : 
    : 
} 

public class SingleModelProvider implements ModelProvider 
{ 
    public SingleModelProvider(Model providedModel, List actions) 
    { 
      : 
    } 
} 

該計劃是在重複使用幾束的SingleModelProvider類以提供ModelProvider的不同實現。我需要在每個包中完成的事情是簡單地將具有適當參數的SingleModelProvider實例化到構造函數中。使用任何DI框架的一個非常簡單的場景。如果可能,我希望使用DS(聲明式服務)註冊ModelProvider服務,而無需在激活器中編寫樣板代碼。

這可能嗎?

我似乎無法找到任何關於如何完成此操作的文檔,因爲DS中的類聲明似乎不允許使用構造函數參數(或setter)。

我使用工廠嗎?我不確定這是否值得,因爲它可能使案例不比手動使用Activator和發佈服務更簡單。

回答

1

爲什麼要使用DS有一個特定的原因嗎?

您也可以使用OSGI Service Compendium version 4.2,121中所述的OSGI藍圖服務。它提供了兩個最好的世界:DI和簡單的服務發佈/消費。

在DS中,據我所知,唯一的選擇是使用工廠,bind/unbind方法不接受用戶類。 (如OSGI Service Compendium version 4.2,112.4.5所述)

+0

在問這個問題之後,我昨天遇到了這個問題,看起來很有希望。我們使用的是Spring DM,但是停止使用它來支持平臺中原生支持的某些東西。這看起來像是最好的選擇,因爲它似乎滿足我所有的需求。你知道最新版本的Eclipse 3.5.x是否支持這個版本。 – Robin 2010-07-06 14:22:13

3

DS確實支持setter。以下是基於您問題中示例的DS xml示例。

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="SampleModelProvider"> 
    <implementation class="test.SampleModelProvider"/> 
    <reference bind="setModel" cardinality="1..1" interface="test.Model" name="Model" policy="static" unbind="unsetModel"/> 
    <reference bind="setList" cardinality="1..1" interface="test.ActionList" name="ActionList" policy="static" unbind="unsetList"/> 
    <service> 
     <provide interface="test.ModelProvider"/> 
    </service> 
</scr:component> 

使用構造函數參數有點違背OSGi的動態特性。服務和軟件包可以隨時啓動和停止。 OSGi友好的代碼需要理解這一點,並具有對稱方法來處理設置和取消設置依賴關係。

對您有一個問題:在您的系統中,誰負責創建模型對象和您希望每個提供者接收的操作列表?它們是否可用作OSGi服務?我提供的示例DS假定它們是OSGi服務。

相關問題