2012-08-04 24 views
14

我知道C#代碼片段和.NET程序集提供了模塊化模板開發的相同功能。我們管理CME中的代碼片段和Visual Studio中的彙編代碼,但在Template Builder中使用相同的方法。C#代碼碎片和程序集TBB之間有什麼區別?

在代碼而言,我可以創建一個C#代碼片段模板建築砌塊(TBB),例如:

var timeStamp = DateTime.Now.ToString("d MMM yyyy"); 
package.PushItem("timeStamp from fragment", package.CreateHtmlItem(timeStamp)); 

我還可以通過實現使用相同的代碼創建.NET組件模板建築砌塊如下所示。

​​3210

docs解釋「SDL外表套上插入在其預定的預定類的方法的代碼片段。」 看起來這個類實現了ITemplate並在下面添加了一些引用(我是否缺少任何東西?)。

assembly setup instructions至少提到這些dll。

  • Tridion.Common.dll
  • Tridion.ContentManager.dll
  • Tridion.ContentManager.Templating.dll
  • Tridion.ContentManager.Publishing.dll

之間的任何其他差片段和大會,你會如何選擇這兩個?

回答

16

當Tridion首次調用模板並修改之後,C#片段被Tridion編譯爲程序集。要編譯片段,外表套上包裝它在一些「地下城門面」(獎勵積分對於那些誰知道這個詞來源於)認爲:

  1. 採用Tridion.ContentManagerTridion.ContentManager.CommunicationManagementTridion.ContentManager.ContentManagementTridion.ContentManager.Templating命名空間
  2. 使Package和在稱爲package字段Engine可用和engine分別
  3. 創建爲C#片段的記錄器是可以通過一個字段稱爲log
  4. 添加引用一些常用的組件(但不增加他們的命名空間一using還)

編輯:給出其他答案似乎很多人不知道如何完成某些在C#片段TBBS的任務,所以下面我將記錄他們:

導入額外的命名空間

導入/使用額外的命名空間到你的C#片段,你需要ŧ Ø使用此語法:

<%@ Import Namespace="Tridion.ContentManager.ContentManagement.Fields" %> 

請注意,這隻會從組件進口的命名空間已被外表套上引用。沒有任何機制可以明確地添加對其他程序集的引用;所以如果您需要第三方DLL,則需要將其添加到GAC。

定義自定義功能

您可以通過使用此語法定義在C#片段自定義字段和功能:

<%! 

public static string GetDate() 
{ 
    return new DateTime().ToString("u").Replace(" ", "T"); 
} 

%> 

定義成員字段和(嵌套)類

定義的語法自定義功能還允許您定義嵌套類和/或成員字段:

<%! 

public class MyLittleHelper 
{ 
    public MyLittleHelper(string param1) 
    { 
    } 
} 

%> 
+0

很好的解釋和一些很好的例子,但仍然存在一個問題。爲什麼(或者應該)你(不)使用C#片段? – 2012-08-06 13:55:16

+0

我看到其他人已經回答了他們的推理,所以我們決定專注於解釋C#片段的工作原理以及如何使用它們完成某些事情。我通常會寫很多C#片段,因爲它們沒有先決條件,這確保了每個人都可以使用它們。 – 2012-08-06 14:05:30

+0

我看到在其他回覆以及弗蘭克詳細(和更新)答案中回答的「如何選擇」部分。基本上,我們可以自由選擇此C#片段功能與Visual Studio和程序集提供的功能。我知道進口,但沒有意識到我們可以訪問'log',也不知道如何定義自定義函數。 +1,並被接受爲「拋棄」一些圍繞C#碎片的_voodoo black magic_,這樣更容易做出明智的決定。 – 2012-08-06 17:26:31

8

Frank解釋了兩種方法之間的差異,但這仍然存在如何在兩者之間進行選擇的問題。我個人的建議是從不使用C#碎片,只有一個例外*。正如你發現的那樣,我個人並不喜歡他們身上發生的一些黑暗魔法。另外,.NET程序員也非常喜歡它們,例如創建類。我只看到一個原因,爲什麼你會訴諸C#碎片:如果你沒有訪問Visual Studio或其他工具來構建DLL。這也不是一個非常強烈的論點:如果你想完成一項工作,你應該得到適當的工具!

* 當然,例外是Tridion會爲您的程序集中的每個ITemplate自動創建的C#碎片。

+1

+1堅持使用正確的工具,並警惕C#碎片。我也認爲幾乎唯一合理的用途是引導程序集模板。只是一個狡辯,你可以*創建類,只要他們是類的成員Tridion包裝你的代碼 – 2012-08-05 17:40:14

+0

@Dominic請參閱,我甚至不知道,因爲所有巫術的東西:) – Quirijn 2012-08-06 09:17:23

+2

雖然我同意你通常應該使用程序集而不是C#片段,這些片段確實有它們的用途。他們更容易更新和分享。他們也很快做到。因此,如果你所要寫的只是一小部分推送包中某些東西的行,那麼我只是把它做成一個片段。不過,我認爲他們是規則的例外。 – 2012-08-06 09:27:06

2

我永遠不會使用C#片段,因爲它使得管理代碼非常困難,而且您需要手動部署它們。如果你確實從Visual Studio編寫代碼,那麼你應該創建一個.NET Building Block程序集。

8

我認爲C#代碼碎片和.net程序集之間的主要區別在於高級桶以下。

步驟分步調試

隨着.NET程序集,你可以做一步一步調試從Visual Studio那裏爲C#代碼片段是不可能的。

再利用或基類

隨着.NET程序集可以擴展了Itemplate創造一些像BaseTemplate和你的模板讓你有常用的設計模式,在爲C#是沒有概念可以擴展它們除Tridion ITemplate接口以外的BaseTemplate。

使用.net程序集,您可以添加常用實用程序類(通常爲TridionUtilities),並且所有模板都指向相同的TridionUtilities以實現常用功能。 C#代碼片段實用功能需要在相同的TBB中定義,並且除非您創建類並部署到GAC,否則不能與其他TBB重用。

更容易升級掃描和維護

使用.NET組件很容易做任何升級掃描像過時的API /方法簡單地提到新的dll/.NET框架。 .net程序集很容易識別對規劃Tridion升級或.net框架升級的潛在影響。 C#代碼片段很難找到不推薦的或任何升級的影響。

開發者友好

顯然.NET程序集使用Visual Studio(開發人員喜歡它!)與C#代碼段在文本編輯器(痛苦)的開發。

當我開始使用Tridion 5.3時,從C#代碼片段開始,很快意識到我爲了不去.net程序集而犯的一個錯誤。

我的投票總是.net程序集和C#代碼片段甚至沒有考慮,除非我沒有選擇。大聲笑..

6

我認爲差異確實最好解釋弗蘭克的答案,至於你將如何選擇這兩者之間。我通常會說,因爲無論如何你都在使用Visual Studio,所以總是爲你的代碼創建一個.NET Assembly TBB。它們爲您提供了更多的好處,例如包含第三方程序集,允許使用類和方法進行適當的編碼更加簡單並且可能最重要,允許進行適當的調試(儘管最後一個可能很難根據您的位置進行設置,客戶環境,防火牆等)。

有對我來說只有兩個例外,使用C#片段:

  1. 在裝配實現了Itemplate類的引用,讓您如果有管理的要求使用這些作爲單獨的TBBS
  2. 常量或支持SDL Tridion其他直接硬編碼常量

2號當然是值得商榷的,但你永遠可以不用配置屬性,對於大多數TBB這些你可以處理使用參數模式,但someti mes更容易,直接將它們寫入C#片段並將它們推送到其他TBB使用的包。

在我的訓練課上,我通常稱爲唯一一次下面的故事我曾經選擇使用C#片段TBB到目前爲止,這表明有多少個例外是使用它們的:

當時我在一家國外的客戶工作,我的出租車去機場的時候正好在10分鐘內離開,當時我指導的一位開發人員問了我一個關於如何從他的TBB中的文件夾中獲得物品列表的問題。我已經關閉了我的Visual Studio和Outlook,並且即將關閉我的筆記本電腦,但很快瀏覽了我的一些代碼示例以找到他需要的東西。知道啓動Visual Studio或Outlook需要幾分鐘時間,我很快將代碼粘貼到C#片段中,以便於參考。

+1

我將在考慮C#片段的條件列表中添加「當你少於10分鐘並關閉Visual Studio」。 ;-) – 2012-08-06 17:31:54

相關問題