2

Castle DynamicProxy を介して生成された型の名前を制御できるかどうかを知っている人はいますか? Castle によって生成されたアセンブリを永続化する機能を利用して、特定の機能を備えたクラスをプロジェクトに追加したいと考えていましたが、これらの生成されたプロキシ タイプの名前を制御できるようにしたいと考えています。どんな助けでも大歓迎です。

実際には、これらのクラスのインスタンスと、プロキシのソースである元のクラスのインスタンスを NHibernate で永続化する予定です。したがって、これらの名前は、アセンブリの複数の世代にわたって一貫している必要があります。

4

2 に答える 2

3

面白い発掘をしました。プロキシ名の指定は、INamingScope を使用して可能であるように見えますが、INamingScope を組み込むのは簡単ではありません。独自の ProxyFactoryFactory を作成する必要があります。これにより、NHibernate.ByteCode.Castle.ProxyFactory と同じ ProxyFactory が作成されます。 ProxyGenerator を初期化します。

public class CustomProxyFactory : AbstractProxyFactory {
    private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator(new CustomProxyBuilder());
    // remainder of code is identical
}

public class CustomProxyBuilder : DefaultProxyBuilder {
    public CustomProxyBuilder() : base(new CustomModuleScope()) {}
}

public class CustomModuleScope : ModuleScope {
    public CustomModuleScope() : base(false, false, new CustomNamingScope(), DEFAULT_ASSEMBLY_NAME, DEFAULT_FILE_NAME, DEFAULT_ASSEMBLY_NAME, DEFAULT_FILE_NAME) {}
}

public class CustomNamingScope : INamingScope {
    public CustomNamingScope() {}

    private CustomNamingScope(INamingScope parent) {
        ParentScope = parent;
    }

    public string GetUniqueName(string suggestedName) {
        // your naming logic goes here
    }

    public INamingScope SafeSubScope() {
        return new CustomModuleScope(this);
    }

    public INamingScope ParentScope { get; private set; }
}

正直なところ、これを実行したりコンパイルしたりしたことはありません。NHibernate と Castle.Core のソース コードを掘り下げるだけです。うまくいけば、それはあなたにいくつかのアイデアを与える...

于 2010-11-18T20:09:39.837 に答える
0

NHContrib の ProxyGenerators プロジェクトを見てください。これにより、NHibernate の遅延読み込みプロキシを事前に生成できます。

http://nhforge.org/wikis/proxygenerators10/default.aspx

ProxyGenerators を使用するかどうかに関係なく、Proxy Factory Factory を介してカスタム プロキシを NHibernate に統合します。hibernate.cfg.xml で:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="proxyfactory.factory_class">YOUR_PROXY_FACTORY_FACTORY</property>
  </session-factory>
</hibernate-configuration>
于 2010-11-17T18:05:06.560 に答える