我了解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.
片段和汇编之间的任何其他区别以及如何在两者之间进行选择?
Fra*_*len 17
当首次调用模板时以及修改模板后,AC#片段由Tridion编译成程序集.为了编译片段,Tridion将它包装在一些"地下城装扮"中(对于那些知道该术语来自何处的人来说,奖励积分):
Tridion.ContentManager
,Tridion.ContentManager.CommunicationManagement
,Tridion.ContentManager.ContentManagement
和Tridion.ContentManager.Templating
命名空间Package
和Engine
提供所谓的领域package
和engine
分别log
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)
弗兰克已经解释了这两种方法之间的区别,但仍然存在如何在两者之间做出选择的问题.我的个人建议是永远不要将C#片段用于任何事情,只有一个例外*.正如你所发现的那样,在我们身上发生了一些我个人不喜欢的黑暗魔法.此外,.NET程序员非常喜欢这些内容,例如创建类.
抛开我的个人品味,我发现只有一个原因,你可以诉诸C#片段:如果你无法访问Visual Studio或其他工具来构建DLL.这也不是一个非常有力的论据:如果你想完成一份工作,你应该得到合适的工具!
*当然,Tridion会自动为程序集中的每个ITemplate创建C#片段.
在我看来,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#代码片段甚至没有考虑,除非我没有选择.大声笑..
我认为差异确实最好用弗兰克的答案解释,你如何在两者之间作出选择.我通常会说,因为您仍在使用Visual Studio,所以始终为您的代码创建.NET程序集TBB.它们为您提供了更多的好处,例如包括第三方程序集,允许使用类和方法进行正确编码更容易,也可能是最重要的,允许正确调试(尽管最后一个可能很难设置,具体取决于您的位置,思考客户环境,防火墙等).
对于我来说,使用C#片段只有两个例外:
数字2当然是值得商榷的,但你永远不能没有配置属性,对于TBB大多数这些你可以使用参数模式来处理,但有时它更容易,直接在C#片段中写它们并且有将它们推送到包装以供其他TBB使用.
在我的培训课程中,我经常提到以下故事:我到目前为止唯一一次选择使用C#Fragment TBB,表明使用它们有多少例外:
我在国外的一个客户工作,我在机场的出租车在10分钟后离开,当时我教练的一位开发人员向我询问了如何从他的TBB中的文件夹中获取项目列表的问题.我已经关闭了我的Visual Studio和Outlook,并且即将关闭我的笔记本电脑,但很快浏览了我的一些代码示例以找到他需要的东西.知道启动Visual Studio或Outlook需要花费几分钟时间,我很快就将代码粘贴到C#Fragment中,以便他可以轻松参考.