15

我了解 C# 代码片段和 .NET 程序集为模块化模板开发提供相同的功能。我们在 CME 中管理代码片段,在 Visual Studio 中管理汇编代码,但在模板生成器中使用相同的方式。

在代码方面,我可以创建一个 C# Code Fragment Template Building Block (TBB),例如:

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

我还可以通过如下实现 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));
    }
  }
}

文档解释说“ SDL Tridion 将代码片段插入到预定义类的预定义方法中”。看起来这个类实现了 ITemplate 并在下面添加了一些引用(我错过了什么吗?)。

程序集设置说明至少提到了这些 dll。

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

片段和程序集之间还有其他区别吗?您将如何在两者之间进行选择?

4

5 回答 5

17

当模板第一次被调用和修改后,AC# 片段被 Tridion 编译成一个程序集。为了编译该片段,Tridion 将其包装在一些“地牢敷料”(那些知道该术语来自哪里的人的奖励积分)中:

  1. 使用Tridion.ContentManagerTridion.ContentManager.CommunicationManagementTridion.ContentManager.ContentManagement命名Tridion.ContentManager.Templating空间
  2. 使Packageand分别在名为andEngine的字段中可用packageengine
  3. 为 C# 片段创建一个记录器,该记录器可通过名为log
  4. 添加对一些常用程序集的引用(但using尚未为其命名空间添加 a)

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

导入其他命名空间

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

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

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

定义自定义函数

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

<%!

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

%>

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

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

<%!

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

%>
于 2012-08-05T00:19:27.390 回答
8

弗兰克已经解释了这两种方法之间的区别,但这仍然留下了如何在两者之间进行选择的问题。我个人的建议是永远不要将 C# 片段用于任何事情,只有一个例外*。正如你所发现的,其中有一些我个人不喜欢的黑暗魔法。此外,还有很多你不能在它们中做的事情是 .NET 程序员非常喜欢的,比如创建类。

撇开我的个人品味不谈,我认为您会求助于 C# 片段的原因只有一个:如果您无法访问 Visual Studio 或其他构建 DLL 的工具。这也不是一个非常有力的论据:如果你想完成工作,你应该得到合适的工具!

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

于 2012-08-05T05:53:04.773 回答
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# 代码片段,除非我别无选择。哈哈..

于 2012-08-06T02:13:55.093 回答
6

我认为弗兰克的回答确实可以最好地解释差异,至于您将如何在两者之间进行选择。我通常会说,既然您一直在使用 Visual Studio,请始终为您的代码创建一个 .NET 程序集 TBB。它们为您提供了更多好处,例如包括 3rd 方程序集,允许使用类和方法进行正确编码更容易并且可能最重要的是,允许正确调试(尽管最后一个可能很难根据您所在的位置进行设置,思考客户环境、防火墙等)。

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

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

第二个当然是有争议的,但你永远不能没有配置属性,对于一个 TBB,你可以使用参数模式来处理大多数这些,但有时直接将它们写在 C# 片段中并拥有它会容易得多将它们推到包装中以供其他 TBB 使用。

在我的培训课程中,我通常会提到以下关于我迄今为止唯一一次选择使用 C# Fragment TBB 的故事,表明使用它们有多大的例外情况:

我在国外的一个客户那里工作,我去机场的出租车在 10 分钟后就要离开,当时我正在指导的一位开发人员问我一个问题,即如何从他的 TBB 中的文件夹中获取项目列表。我已经关闭了我的 Visual Studio 和 Outlook,正要关闭我的笔记本电脑,但我快速浏览了我的一些代码示例以找到他需要的东西。知道启动 Visual Studio 或 Outlook 需要几分钟,我迅速将代码粘贴到 C# 片段中,以便他方便参考。

于 2012-08-06T08:52:49.220 回答
2

我永远不会使用 C# 片段,唯一的原因是它使您的代码管理非常困难并且您需要手动部署它们。如果您确实从 Visual Studio 编写代码,那么您应该创建一个 .NET Building Block 程序集。

于 2012-08-05T11:18:29.637 回答