15

C# コード フラグメントと .NET アセンブリは、モジュラー テンプレート開発に同じ機能を提供することを理解しています。CME でコード フラグメントを管理し、Visual Studio でアセンブリ コードを管理しますが、Template Builder では両方を同じ方法で使用します。

コードに関しては、C# コード フラグメント テンプレート ビルディング ブロック (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

フラグメントとアセンブリのその他の違いと、2 つをどのように選択しますか?

4

5 に答える 5

17

テンプレートが最初に呼び出され、変更された後、AC# フラグメントは Tridion によってアセンブリにコンパイルされます。フラグメントをコンパイルするために、Tridion は次のような「ダンジョン ドレッシング」 (用語の由来を知っている人にとってはボーナス ポイント) でラップします。

  1. Tridion.ContentManagerTridion.ContentManager.CommunicationManagementTridion.ContentManager.ContentManagementおよびTridion.ContentManager.Templating名前空間を使用
  2. とをそれぞれと という名前のフィールドPackageEngine使用できるようにしますpackageengine
  3. というフィールドから使用できる C# フラグメントのロガーを作成します。log
  4. 一般的に使用されるいくつかのアセンブリへの参照を追加します (ただしusing、それらの名前空間にはまだ追加しません)

編集:他の回答を考えると、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

Frank は 2 つのアプローチの違いを説明しましたが、それでも 2 つの方法のどちらを選択するかという問題が残ります。私の個人的なアドバイスは、1 つの例外を除いて、C# フラグメントを何にも使用しないことです*。あなたが知っているように、私が個人的に好きではないいくつかの暗い魔法が起こっています. また、クラスの作成など、.NET プログラマーが非常に好きなように、それらで実行できないことがたくさんあります。

私の個人的な好みはさておき、C# フラグメントに頼る理由は 1 つだけだと思います。それは、Visual Studio や DLL をビルドする別のツールにアクセスできない場合です。また、これもあまり強力な議論ではありません。仕事をやりたいのであれば、適切なツールを入手する必要があります。

*もちろん、アセンブリ内の ITemplate ごとに Tridion が自動的に作成する 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 内で定義する必要があり、クラスを作成して GAC にデプロイしない限り、他の TBB で再利用することはできません。

より簡単なアップグレード スキャンとメンテナンス

.net アセンブリを使用すると、新しい dll/.net フレームワークを参照するだけで、非推奨の API/メソッドなどのアップグレード スキャンを簡単に実行できます。.net アセンブリを使用すると、Tridion のアップグレードまたは .net Framework のアップグレードの計画に対する潜在的な影響を簡単に特定できます。C# コード フラグメントでは、廃止されたものやアップグレードの影響を見つけるのがはるかに困難です。

開発者フレンドリー

明らかに、.net アセンブリは、Visual Studio を使用して開発されます (開発者はそれを気に入っています!) 対、テキスト エディターで C# コード フラグメントを使用する (面倒です)。

Tridion 5.3 に戻ったとき、C# コード フラグメントから始めて、.net アセンブリに移行しなかったことの間違いにすぐに気付きました。

私の投票は常に .net アセンブリであり、選択肢がない限り、C# コード フラグメントは考慮されません。笑..

于 2012-08-06T02:13:55.093 に答える
6

2つからどのように選択するかについて、実際の違いはフランクの答えで最もよく説明されていると思います。とにかく Visual Studio を使用しているので、常にコード用に .NET アセンブリ TBB を作成します。それらは、サードパーティのアセンブリを含めるなど、より多くの利点を提供します。クラスとメソッドを使用した適切なコーディングがはるかに簡単になり、おそらく最も重要なことです。の環境、ファイアウォールなど)。

C# Fragments を使用する場合の例外は 2 つだけです。

  1. アセンブリで ITemplate を実装するクラスへの参照。これらを個別の TBB として使用できます。
  2. 定数またはその他のハードコードされた定数を SDL Tridion から直接管理する必要がある場合

番号 2 はもちろん議論の余地がありますが、構成プロパティなしでは決してできません。TBB の場合、これらのほとんどはパラメーター スキーマを使用して処理できますが、C# フラグメントに直接記述してそれを使用する方がはるかに簡単な場合もあります。他のTBBが使用できるようにパッケージにプッシュします。

私のトレーニング セッションでは、これまで C# Fragment TBB を使用することを選択した唯一の例について、次の話をよく参照し、それらを使用することがどれほどの例外であるかを示しています。

私は海外の顧客で働いていて、空港行きのタクシーが 10 分後に出発するときに、私が指導していた開発者の 1 人が、彼の TBB のフォルダーからアイテムのリストを取得する方法について質問しました。私はすでに Visual Studio と Outlook を閉じており、ラップトップをシャットダウンしようとしていましたが、必要なものを見つけるためにいくつかのコード サンプルをすばやく参照しました。Visual Studio または Outlook の起動には数分かかることを知っていたので、すぐにコードを C# フラグメントに貼り付けて、彼が簡単に参照できるようにしました。

于 2012-08-06T08:52:49.220 に答える
2

コードの管理が非常に難しく、手動でデプロイする必要があるという唯一の理由から、C#フラグメントを使用することは決してありません。また、Visual Studioからコードを作成する場合は、.NETビルディングブロックアセンブリを作成する必要があります。

于 2012-08-05T11:18:29.637 に答える