Castle DynamicProxy生成了类名

时间:2010-11-17 14:57:14

标签: nhibernate castle-dynamicproxy

有人知道是否可以控制通过Castle DynamicProxy生成的类型的名称?我希望利用保持Castle生成的程序集的能力,为我的项目添加一些具有某些特定功能的附加类,但我希望能够控制这些生成的代理类型的名称。任何帮助将不胜感激。

我实际上计划持久化这些类的实例以及作为NHibernate代理源的原始类的实例。所以,我需要这些名称在多代装配中保持一致。

2 个答案:

答案 0 :(得分: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源代码。希望它能给你一些想法...

答案 1 :(得分: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>