2012-02-03 41 views
4

我們試圖部署業務連接服務(BCS)模型解決方案,其中模型中的屬性取決於Web服務公開的數據結構。如何動態生成業務連接服務

理想情況下,BCS模型會公開一個鍵/值對的集合,然後將其轉換爲分享點列表中的列,因爲這意味着相同的模型可以用於多個不同的數據集,但是從我們可以告訴的這不是如何設計BCS模型的,因爲它們依賴模型進行強類型化以反映正在導入的實體。

因此,我們正在尋找一種解決方案,使用戶能夠通過在遠程數據集中通過sharepoint中央管理中的自定義頁面提供url來「創建」一個新的外部列表,然後將自動構建BCS模型項目(通過更改項目模板),然後編譯和釋放生成的功能。

通過這種方式,我們可以創建具有代表所導入數據結構的屬性的「固定」類。

例如,數據源A可以暴露

<cars> 
<car> 
<color>blue</color> 
<make>ford</make> 
</car> 
<car> 
<color>red</color> 
<make>lotus</make> 
</car> 
</cars> 

在這種情況下,我們需要一個BCS模型有兩個公共屬性,顏色「汽車」,並 但是數據源B可以暴露

<invoices> 
<invoice> 
<amount>£34.00</amount> 
</invoice> 
<invoice> 
<amount>£34.00</amount> 
</invoice> 
</invoices> 

在這種情況下,我們需要一個帶有單個公共財產的BC​​S模型「發票」。

希望任何人對此方法或實現此「最佳實踐」方式的反饋意見。

回答

1

[我已經有經驗做類似的事情在.net - 我不知道這將是你如何相關的。]

我不得不寫的導入工具,可以處理任何文件格式。爲了正確處理這個問題,我編寫了一個小類,它將採用xml格式定義(名稱,數據類型,格式字符串,自定義解析器等),並生成一個可以讀取該文件並公開一個IQueryable<FileFormat>和一些額外的元數據。

值得注意的是,爲了使其完全靈活,我不得不允許格式定義提供一個C#/ VB lambda,它將被編譯和執行(例如,當輸入日期格式非標準且需要定製解析器)。這顯然是一種安全風險 - 所以當我實例化動態類時,我在一個獨立的AppDomain中做了很少的特權。這可能不適用於您的情況。

我們使用自定義模板引擎生成代碼,然後使用System.Codedom.Compiler命名空間編譯代碼 - 這允許我們創建程序集並緩存它們,直到定義更改。如果你做類似的事情,可能值得考慮Razor模板引擎。

我們從編碼未知數據類型中產生的唯一真正的問題。通過使定製類實現我們自己的IImportFile以標準方式公開元數據的界面(實際上與xml規範中的信息相同),我們可以在不費力的情況下解決它。

我們很幸運,這是一個值得信賴的用戶使用的工具(至少只有受信任的用戶可以提供新的文件格式規範),所以安全風險是有限的。如果您正在根據用戶輸入編譯代碼,請確保您有足夠的安全措施。