Nhibernate Castle DynamicProxy生成的类名

Nhibernate Castle DynamicProxy生成的类名,nhibernate,castle-dynamicproxy,Nhibernate,Castle Dynamicproxy,有人知道是否可以控制通过Castle DynamicProxy生成的类型的名称吗?我希望利用Castle生成的程序集持久化的能力,向我的项目中添加一些具有特定功能的附加类,但我希望能够控制这些生成的代理类型的名称。任何帮助都将不胜感激 我实际上计划持久化这些类的实例以及原始类的实例,它们是NHibernate代理的来源。所以,我需要这些名称在程序集的多代中保持一致 看看NHContrib中的ProxyGenerators项目。它允许您预生成NHibernate的延迟加载代理 无论是否使用Pro

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


我实际上计划持久化这些类的实例以及原始类的实例,它们是NHibernate代理的来源。所以,我需要这些名称在程序集的多代中保持一致

看看NHContrib中的ProxyGenerators项目。它允许您预生成NHibernate的延迟加载代理

无论是否使用ProxyGenerator,都可以通过代理工厂将自定义代理集成到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>

您的\u代理\u工厂\u工厂

我做了一些有趣的挖掘。使用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进行挖掘。核心源代码。希望它能给你一些想法……

我想你误解了我的目标。我不想改变NHibernate代理的工作方式。我想要另一组从现有的具有额外行为的持久类派生的持久类。所以,如果我有一个名为Product的类,我想生成一个名为ProductOverride的代理类,该类派生自Product,它将改变行为,但也有稍微不同的数据库映射。所以,我的问题更多的是关于DynamicProxy,而不是关于NHibernate。我意识到我可以通过一些代码生成来实现这一点,但我更希望它发生在运行时。为什么不使用标准的NHibernate继承映射来实现这一点呢?你为什么还要乱搞动态代理呢?因为我不想维护这些类。我不是在寻找另一种设计。我有几个。手动创建实际类,通过代码生成创建实际类。它们都会使维护工作量加倍。我想避免这样,我很困惑。如果您不想维护这些类,那么您打算将代码放在哪里?虽然我需要更多地了解您的使用场景,但是您可能可以使用AOP来实现这一点。除了拦截器和生成类的代码之外,没有其他代码。我完全理解NHibernate的功能,以及它如何使用Castle DynamicProxy。我想要的类似于AOP,因为我想使用截取,但我想将代理作为一级实体持久化,以便它们可以重新水化,并与它们所基于的类分开使用。那么,回到我最初的问题:你知道是否有可能控制Castle DynamicProxy生成的代理的命名吗?如果不可能,那就不可能了。我会在接下来的几天里给你打一针,让你知道事情的进展。鬼鬼祟祟的,鬼鬼祟祟的;)您正确地指出,这远不是简单的,而且是有原因的。它并不是要被推翻的。无论如何,如果您这样做,则有一个假设(不记得是否有文档记录),即命名范围将是一致的-对于给定的
suggestedName
,它将始终返回相同的唯一名称(显然,它必须是唯一的,因此,如果您调用该方法两次,它应始终返回相同的第二个值,依此类推)。反序列化过程取决于此。嗨,Krysztof,在代理给定类时,DynamicProxy中INamingScope的默认实现是否始终生成相同的类名,即使在应用程序的后续运行中也是如此,还是在卸载并再次加载应用程序域后生成新名称?另外,如果代理的类在运行之间被修改了怎么办?它只在帐户中记录名称和顺序。最好运行write a protorype并尝试执行您需要的任何操作,看看它是否适用于您的场景。我不断获取
System.ArgumentException:程序集中的类型名称重复。
除非我返回随机生成的名称,这与文档不符:“实现者必须返回确定性名称,即当使用相同的建议名称调用两次
GetUniqueName
时,每次都应提供相同的返回名称。非确定性返回值(如附加随机后缀)将破坏代理的序列化。”