6

これは非常に奇妙な要件であると確信していますが、ここに行きます。

クラス ライブラリにコンパイルする C# クラスによって表される顧客構成コードがいくつかあります。これらの構成クラスを作成することは、現在、開発者以外の誰かに割り当てたい猿の仕事です。そのため、ビジネス アナリストが関連するオプションを選択してフォームに入力することにより、有効な C# クラスを生成するために使用できる "Configurator" Web サイトを構築しています。

MVC Web サイトのテンプレートから C# クラスを生成する最良の方法は何ですか? ここでは、実行時にクラスを動的に生成して実行することについて話しているわけではないことに注意してください。基本的には、まったく別のプロジェクトに含まれる C# コードをたまたま含むテキスト ファイルを生成しています。

これは、適切にグーグルするのが非常に難しいトピックであることが証明されています! 今まで出てきた選択肢…

  • トークン化されたテキスト ファイルを使用し、String.Format を使用して値を置き換えるだけです。
  • どういうわけかRazorをテンプレートエンジンとして使用します(ただし、方法がわからず、生成しているhtmlではありません)
  • どういうわけかT4テンプレートを使用します(少なくともC#の生成に使用されていることは知っていますが、実行時に実行する方法はわかりません)

これにどのようにアプローチするのが最善かについてのアイデアはありますか?

リクエストに応じて、出力クラス/ファイルの例を次に示します。ここの値は、顧客固有のラベル、検証などで基本クラスに設定された値をオーバーライドします。これが、顧客向けに製品をカスタマイズする方法です。

public class AreaRiskTemplate: AreaRiskTemplateBase
{
    public override string EntityName { get { return "risk"; } }
    public override string EntityNamePlural { get { return "risks"; } }
    public override string EntityNameArticle { get { return "a"; } }
    public override string CGovItemRefPrefix { get { return "R"; } }
    public override void SetFieldDefinitions()
    {

        FieldDefinitions.Level1.IsImplemented = true;
        FieldDefinitions.Level1.Label = "Category";
        FieldDefinitions.Level1.IsVisibleInGrid = true;

        FieldDefinitions.Level2.IsImplemented = true;
        FieldDefinitions.Level2.Label = "Team";
        FieldDefinitions.Level2.IsVisibleInGrid = true;

        FieldDefinitions.Description.IsImplemented = true;
        FieldDefinitions.Description.Label = "Description";
        FieldDefinitions.Description.IsVisibleInGrid = true;

    }
    public override ModelStateDictionary Validate()
    {
        var msd = new ModelStateDictionary();
        // add template-specific validation here
        msd.Merge(base.Validate());
        return msd;
    }
    public override List<string> Level1Options
    {
        get
        {
            return new List<string>
                {
                    "Organisational",
                    "Financial",
                    "Operational",
                    "External",
            "IT"
                };
        }
    }
}

更新: 現在、 http://msdn.microsoft.com/en-us/library/ee844259 (v=vs.100) .aspx で T4 テンプレートを調査しています (以下のコメントに感謝します)。有望に見えます。

4

2 に答える 2

1

Web サイトは避けて、単純に CodeSmith を使用することをお勧めします。情報を要求して必要なコードを生成するように CodeSmith スクリプトを設計できます。CodeSmith を購入する必要はありますが、作業は大幅に減ったようです。

于 2012-09-20T15:19:22.920 に答える
0

最小限のオーバーヘッドでこれを行う方法は、Microsoft の組み込みCodeDOM APIを使用することです。言語間で互換性のあるドキュメント オブジェクト モデルを使用して、CLR コード ドキュメントを作成および操作できます。

このアプローチの唯一の欠点は、言語固有の機能を実装する方法がすぐにはわからないことです。たとえば、C#readonlyフィールドは、すべての CLR 言語で使用できるわけではなく、C# でのみ使用できるためです。この特定の複雑さに対する解決策は、 を使用しCodeSnippetて手動コードを文字列として挿入することです。その他の複雑な不一致の問題は、CodeDOM をテンプレート エンジンと統合することで軽減できます。Oleg Sych は、CodeDOM と T4 テンプレート エンジンの統合に関する有益な記事を書きました。厳密に型指定されたドキュメント オブジェクト モデルは純粋なテキストよりもエラーが発生しにくいため、私は純粋なテキスト生成アプローチよりもこの種のアプローチを好みます。

さらに、出力コードをコンパイルする必要がある場合は、これも CodeDOM API でサポートされています。

これが頻繁に使用されると思われる方法である場合は、ビルダー パターンを使用して、いくつかの一般的な DOM 操作機能を流暢なメソッド呼び出しにラップすることをお勧めします。私はこのアプローチを使用する個人用ライブラリを作成しましたが、コード生成による生産性の向上に非常に成功しています。

于 2012-09-20T15:55:24.963 に答える