0

コードを変更せずに SubSonic ジェネレーターを拡張することは可能ですか? テンプレート内で使用できる独自のカスタム メソッドを追加したいと思います。Utility.GetVariableType メソッドのようなもの。

4

4 に答える 4

3

組み込みのテンプレートを拡張することはできませんが、 SubSonic.dll を変更せずに独自のテンプレートに置き換えることができます。ここで templateDirectory パラメータを参照してください: http://subsonicproject.com/docs/Generated_Classes/#Customizing_Active_Record

構成例は次のとおりです。

<SubSonicService defaultProvider="Northwind" enableTrace="true"
    templateDirectory="C:\Program Files\SubSonic\SubSonic 2.0.3\Templates\MVC">
    <providers>
      <clear/>
      <add name="Northwind" type="SubSonic.SqlDataProvider, SubSonic"
       connectionStringName="Northwind" generatedNamespace="Northwind"/>
    </providers>
  </SubSonicService>

組み込みの ActiveRecord テンプレートの現在のバージョンは、ここから取得できます。

于 2009-04-24T21:38:57.663 に答える
1

私は自分の問題の解決策を見つけました:)。
SubSonic コード自体を再構築または変更する必要なく、テンプレートで必要な機能を使用して SubSonic を拡張できるようになりました。
それは私がやりたかったことで機能し、他の人にも役立つと思うので、ここにあります:

  1. 新しいクラス ライブラリ SubSonicHelper を作成します。私のクラスは次のようになります。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Helpers.SubSonic
    {
        public class GeneratorHelper
        {
            public bool IsColumnAllowed(string columnName)
            {
                return columnName.Length == 1 ||
                       (columnName.Length > 1 && 
                       (!(columnName[0].ToString().Equals("_") && 
                       columnName[columnName.Length - 1].ToString().Equals("_"))))
            }
        }
    }
    
  2. アセンブリをビルドし、SubSonicHelper.dll をサブソニック プロジェクトにコピーします。
  3. templateDirectory パラメータを使用して、独自のテンプレートを使用するように SubSonic プロジェクトをセットアップします。
  4. 独自のテンプレートを編集し、次のconst bool showGenerationInfo = false;

    System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(
        System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "SubSonicHelper.dll"));
    object instance = a.CreateInstance("Helpers.SubSonic.GeneratorHelper");
    Type type = instance.GetType();
    

この後、テンプレート内で使用できる GeneratorHelper のインスタンスが作成されます。メソッドにアクセスするには、次のことを行う必要があります。

  1. 使用するメソッドのパラメーターのオブジェクトの配列を作成します。col.propertyName に設定した columnName パラメータがあります。これは、Update メソッドの foreach (Cols の TableSchema.TableColumn col) ループ内にあります。
  2. オブジェクト配列を引数として使用するメソッドを呼び出します。
  3. 結果オブジェクトをチェックして、メソッドの結果を確認します。

    object[] arg = new object[]{col.PropertyName};
    object isColumnAllowedResult = type.InvokeMember("IsColumnAllowed", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, instance, arg);
    if (Convert.ToBoolean(isColumnAllowedResult))
    

それでおしまい!これで、テンプレート内で使用したい他のメソッドで SubSonicHelper クラスを拡張できます。

于 2009-04-29T13:35:17.003 に答える
0

短い答えはノーです。何か役に立つものを思いついたら、パッチを提出してください。コアに統合される可能性があります。ここからパッチを送信できます: http://code.google.com/p/subsonicproject/issues/list

于 2009-04-24T15:08:55.090 に答える
0

テンプレートにdllをインポートできませんか? <%@ Import namespace="NewHelpers.Utilities"%> の
よう にしてから、関数を呼び出すか、オブジェクトのインスタンスを作成します

于 2009-04-24T16:20:05.200 に答える