0

カスタム コントローラ (サービス付き) 用の T4 テンプレートを作成しようとしています。ただし、設定にいくつか問題があります。私は現在、具体的な無料の T4 ツール エディターと TextTemplatingFileGenerator をカスタム ツールとして使用しています。実験中にいくつかの問題が発生しています。

1: MvcTextTemplateHost を使用してみます mvcHost = (MvcTextTemplateHost)(Host); 「型または名前空間名 MvcTextTemplateHost が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)」と表示されます。カスタム ツールをクリアすると表示されますが、生成された T4 ファイルを表示するにはどうすればよいか疑問に思っていました。ツールをクリアしますか?

2: 別のアプローチは Steve Sanderson の CustomTemplate でしたが、DynamicTransform が見つからないという問題があり、それを使用するために必要なファイルをどこで入手できるか疑問に思っていました。このためにツールをクリアする必要がある場合、生成されたサンプル ファイルを表示するにはどうすればよいですか? どうもありがとうございました。

マックス・ギルマン

サンプルコード:

<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #>
<#@ Output Extension="cs" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace someNamespace
{ 

<#  
    var modelType = (CodeType)Model.ModelType; 
    var modelName = modelType.Name; 
    var modelNamePlural = Model.ModelTypePluralized; 
    var modelVariable = modelName.ToLower(); 
    var relatedEntities = ((IEnumerable)Model.RelatedEntities).OfType<RelatedEntityInfo>();
    var primaryKeyProperty = modelType.VisibleMembers().OfType<CodeProperty>().Single(x => x.Name == Model.PrimaryKey); 
    var routingName = Regex.Replace(Model.ControllerName, "Controller$", "", RegexOptions.IgnoreCase);
    var isObjectContext = ((CodeType)Model.DbContextType).IsAssignableTo<System.Data.Objects.ObjectContext>();
#>
    public class foo
    {
        //This is a basic comment.
    }
}
4

1 に答える 1

2

どちらの場合も、Visual StudioプロジェクトでT4テンプレートを使用し、TextTemplatingFileGeneratorをカスタムツールとして使用してテンプレートからコードを生成しようとしているように見えます。

1:MvcTextTemplatingHostは、ASP.NETMVCの[ビューの追加]または[コントローラーの追加]ダイアログを使用する場合にのみ使用できるカスタムT4ホストです。TextTemplatingFileGeneratorカスタムツールを使用すると、使用できなくなり、適切に初期化されません。

2:SteveSandersonのMvcScaffolding/ T4Scaffoldingは独自のカスタムT4ホストを使用しているため、ここでも同様の問題が発生します。NuGetパッケージマネージャーコンソールをカスタムT4スキャフォールディングテンプレートで使用する場合は機能するはずですが、TextTemplatingFileGeneratorカスタムツールでは機能しません。DynamicTransformクラス自体は存在しません。CodePlexのT4Scaffoldingソースコードを見ると、InvokeScaffoldTemplateCmdletクラスで、Inherits = "DynamicTransform"ディレクティブが実際に削除され、動的モデルオブジェクトへの参照に置き換えられていることがわかります。コントローラをスキャフォールディングすると、さまざまなプロパティ(Model.ModelTypeなど)がカスタムホストと動的モデルオブジェクトに設定されてから、処理のためにT4テンプレートに渡されます。

上記の両方の場合、TextTemplatingFileGeneratorでのT4テンプレートの使用は、T4テンプレートで使用する前に初期化する必要があるカスタムテンプレートホストを使用するため、機能しません。

私はあなたの選択肢は次のとおりだと思います:

  1. カスタムASP.NETMVCT4テンプレートを作成し、ASP.NETツールを使用して、[コントローラーの追加]ダイアログを使用してカスタムコントローラーを生成します。
  2. カスタムスキャフォールディングT4テンプレートを作成し、NuGetパッケージマネージャーコンソールを使用してカスタムコントローラーを生成します。
  3. T4テンプレートから使用できるカスタムホストを初期化する独自のカスタムツールを作成します。

MvcScaffoldingは既存のコードを削除せずに既存のコントローラーコードを更新できると私は信じているので、オプション2)がおそらく最善の策です。

于 2011-09-22T20:36:35.307 に答える