0


2

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

4 Answer


3


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

http://subsonic.wekeroad.com/docs/Setting_up_SubSonic_2.x[設定例]は次のようになります。

https://github.com/subsonic/SubSonic-2.0/tree/master/SubSonic/CodeGeneration/Templates[こちら]から、組み込みのActiveRecordテンプレートの最新バージョンを入手できます。


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("_"))))
        }
    }
}
  1. アセンブリをビルドし、SubSonicHelper.dllをsubsonicにコピーします プロジェクト。

  2. SubSonicプロジェクトをセットアップして、独自のテンプレートを使用します templateDirectoryパラメーター。

  3. 独自のテンプレートを編集し、次の後に 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(TableSchema.TableColumn cols in cols)ループ内にあります。

  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クラスをテンプレート内で使用したい他のメソッドで拡張することができます。


0


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


0


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