有人知道是否可以控制通过Castle DynamicProxy生成的类型的名称?我希望利用保持Castle生成的程序集的能力,为我的项目添加一些具有某些特定功能的附加类,但我希望能够控制这些生成的代理类型的名称。任何帮助将不胜感激。
我实际上计划持久化这些类的实例以及作为NHibernate代理源的原始类的实例。所以,我需要这些名称在多代装配中保持一致。
答案 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>