コードを変更せずに SubSonic ジェネレーターを拡張することは可能ですか? テンプレート内で使用できる独自のカスタム メソッドを追加したいと思います。Utility.GetVariableType メソッドのようなもの。
4 に答える
組み込みのテンプレートを拡張することはできませんが、 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 テンプレートの現在のバージョンは、ここから取得できます。
私は自分の問題の解決策を見つけました:)。
SubSonic コード自体を再構築または変更する必要なく、テンプレートで必要な機能を使用して SubSonic を拡張できるようになりました。
それは私がやりたかったことで機能し、他の人にも役立つと思うので、ここにあります:
新しいクラス ライブラリ 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("_")))) } } }- アセンブリをビルドし、SubSonicHelper.dll をサブソニック プロジェクトにコピーします。
- templateDirectory パラメータを使用して、独自のテンプレートを使用するように SubSonic プロジェクトをセットアップします。
独自のテンプレートを編集し、次の
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 のインスタンスが作成されます。メソッドにアクセスするには、次のことを行う必要があります。
- 使用するメソッドのパラメーターのオブジェクトの配列を作成します。col.propertyName に設定した columnName パラメータがあります。これは、Update メソッドの foreach (Cols の TableSchema.TableColumn col) ループ内にあります。
- オブジェクト配列を引数として使用するメソッドを呼び出します。
結果オブジェクトをチェックして、メソッドの結果を確認します。
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 クラスを拡張できます。
短い答えはノーです。何か役に立つものを思いついたら、パッチを提出してください。コアに統合される可能性があります。ここからパッチを送信できます: http://code.google.com/p/subsonicproject/issues/list
テンプレートにdllをインポートできませんか?
<%@ Import namespace="NewHelpers.Utilities"%>
の
よう
にしてから、関数を呼び出すか、オブジェクトのインスタンスを作成します