C#代码片段和程序集TBB之间有什么区别?

Alv*_*yes 15 tridion

我了解C#Code Fragments和.NET Assemblies为模块化模板开发提供了相同的功能.我们在Visual Studio中管理CME和汇编代码中的代码片段,但在Template Builder中使用相同的方法.

在代码方面,我可以创建一个C#代码片段模板构建块(TBB),例如:

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

我还可以通过实现如下的ITemplate,使用相同的代码创建.NET程序集模板构建块.

using System;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;

namespace CreateAndBreakTemplates
{
  [TcmTemplateTitle("Add Date to Package")]
  public class AddDateToPackage : ITemplate
  {
    public void Transform(Engine engine, Package package)
    {
      var timeStamp = DateTime.Now.ToString("d MMM yyyy");
      package.PushItem("timeStamp from assembly", 
                       package.CreateHtmlItem(timeStamp));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

文档解释"SDL外表套上插入在其预定的预定类的方法的代码片段." 看起来这个类实现了ITemplate并在下面添加了一些引用(我错过了什么?).

组件安装说明至少提及这些DLL.

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

片段和汇编之间的任何其他区别以及如何在两者之间进行选择?

Fra*_*len 17

当首次调用模板时以及修改模板后,AC#片段由Tridion编译成程序集.为了编译片段,Tridion将它包装在一些"地下城装扮"中(对于那些知道该术语来自何处的人来说,奖励积分):

  1. 使用Tridion.ContentManager,Tridion.ContentManager.CommunicationManagement,Tridion.ContentManager.ContentManagementTridion.ContentManager.Templating命名空间
  2. 使得PackageEngine提供所谓的领域packageengine分别
  3. 为通过名为的字段提供的C#片段创建记录器 log
  4. 添加对一些常用程序集的引用(但using尚未为其命名空间添加)

编辑:鉴于其他答案,似乎很多人都不知道如何在C#片段TBB中完成某些任务,所以我将在下面记录它们:

导入其他名称空间

要将其他名称空间导入/使用到C#片段中,您需要使用以下语法:

<%@ Import Namespace="Tridion.ContentManager.ContentManagement.Fields" %>
Run Code Online (Sandbox Code Playgroud)

请注意,这只会从Tridion已引用的程序集中导入名称空间.您没有明确添加对其他程序集的引用的机制; 因此,如果您需要第三方DLL,则需要将其添加到GAC.

定义自定义函数

您可以使用以下语法在C#片段中定义自定义字段和函数:

<%!

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

%>
Run Code Online (Sandbox Code Playgroud)

定义成员字段和(嵌套)类

定义自定义函数的语法还允许您定义嵌套类和/或成员字段:

<%!

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

%>
Run Code Online (Sandbox Code Playgroud)


Qui*_*ijn 8

弗兰克已经解释了这两种方法之间的区别,但仍然存在如何在两者之间做出选择的问题.我的个人建议是永远不要将C#片段用于任何事情,只有一个例外*.正如你所发现的那样,在我们身上发生了一些我个人不喜欢的黑暗魔法.此外,.NET程序员非常喜欢这些内容,例如创建类.

抛开我的个人品味,我发现只有一个原因,你可以诉诸C#片段:如果你无法访问Visual Studio或其他工具来构建DLL.这也不是一个非常有力的论据:如果你想完成一份工作,你应该得到合适的工具!

*当然,Tridion会自动为程序集中的每个ITemplate创建C#片段.

  • 虽然我同意您通常应该使用程序集而不是C#片段,但这些片段确实有其用途.它们更易于更新和共享.他们也很快做.因此,如果您要编写的所有内容都是少数几行推送包中的内容,那么我只会将其作为一个片段.不过,我确实认为它们是规则的例外. (2认同)

Ram*_*m G 8

在我看来,C#代码片段和.net程序集之间的主要区别分为以下高级存储桶.

逐步调试

使用.net程序集,您可以从visual studio进行逐步调试,而C#代码片段则无法进行调试.

重用或基类

使用.net程序集,您可以扩展ITemplate以创建类似BaseTemplate的东西,并且所有模板都可以扩展它们以便您拥有通用的设计模式,而C#除了Tridion ITemplate接口之外没有BaseTemplate的概念.

使用.net程序集,您可以添加常用的实用程序类(通常是TridionUtilities),并且所有模板都引用相同的TridionUtilities以实现常见功能.C#代码片段实用程序函数需要在同一TBB中定义,并且不能与其他TBB一起使用,除非您创建一个类并部署到GAC.

更轻松的升级扫描和维护

使用.net程序集,可以更轻松地执行任何升级扫描,例如弃用的API /方法,只需引用新的dll/.net框架..net程序集可以轻松识别对Tridion升级或.net框架升级计划的潜在影响.C#代码片段很难找到已弃用或升级的任何影响.

开发者友好

显然.net程序集是使用Visual Studio开发的(开发人员喜欢它!)与文本编辑器中的C#代码片段(痛苦).

当我开始使用Tridion 5.3时,开始使用C#代码片段,并很快意识到我为了不进行.net程序集而犯的错误.

我的投票总是.net程序集和C#代码片段甚至没有考虑,除非我没有选择.大声笑..


Bar*_*man 6

我认为差异确实最好用弗兰克的答案解释,你如何在两者之间作出选择.我通常会说,因为您仍在使用Visual Studio,所以始终为您的代码创建.NET程序集TBB.它们为您提供了更多的好处,例如包括第三方程序集,允许使用类和方法进行正确编码更容易,也可能是最重要的,允许正确调试(尽管最后一个可能很难设置,具体取决于您的位置,思考客户环境,防火墙等).

对于我来说,使用C#片段只有两个例外:

  1. 对程序集中实现ITemplate的类的引用,允许您将它们用作单独的TBB
  2. 如果需要直接从SDL Tridion管理常量或其他硬编码常量

数字2当然是值得商榷的,但你永远不能没有配置属性,对于TBB大多数这些你可以使用参数模式来处理,但有时它更容易,直接在C#片段中写它们并且有将它们推送到包装以供其他TBB使用.

在我的培训课程中,我经常提到以下故事:我到目前为止唯一一次选择使用C#Fragment TBB,表明使用它们有多少例外:

我在国外的一个客户工作,我在机场的出租车在10分钟后离开,当时我教练的一位开发人员向我询问了如何从他的TBB中的文件夹中获取项目列表的问题.我已经关闭了我的Visual Studio和Outlook,并且即将关闭我的笔记本电脑,但很快浏览了我的一些代码示例以找到他需要的东西.知道启动Visual Studio或Outlook需要花费几分钟时间,我很快就将代码粘贴到C#Fragment中,以便他可以轻松参考.