2010-11-17 74 views
2

有沒有人知道是否可以控制通過Castle DynamicProxy生成的類型的名稱?我希望利用持久化Castle生成的程序集的能力來爲我的項目添加一些具有某些特定功能的附加類,但是我希望能夠控制這些生成的代理類型的名稱。任何幫助將不勝感激。Castle DynamicProxy生成的類名稱

我實際上計劃持久化這些類的實例以及作爲NHibernate代理源的原始類的實例。所以,我需要這些名稱在多代裝配中保持一致。

回答

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源代碼即可。希望它給你一些想法...

+0

夥計,你是我的英雄。 – yonkz 2010-11-18 21:53:33

+0

我會在接下來的幾天給這個鏡頭,讓你知道它是怎麼回事。 – yonkz 2010-11-18 21:55:11

+0

偷偷摸摸很偷偷摸摸;)你正確地指出__it遠非直截了當,並且有一個原因。這並不完全是爲了被覆蓋。無論如何,如果你這樣做,有一個假設(不記得是否記錄在案)命名範圍將是一致的 - 對於給定的'suggestName',它將**總是**返回相同的唯一名稱(顯然它必須是唯一的,如果你調用這個方法兩次,它應該總是返回相同的第二個值,依此類推)。反序列化過程依賴於它。 – 2010-11-19 11:35:16

0

查看NHContrib中的ProxyGenerators項目。它允許你預先生成NHibernate的懶加載代理。

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

無論您使用ProxyGenerators與否,你通過代理工廠工廠整合您的自定義代理到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> 
+0

我認爲你誤解了我的目標。我不想改變NHibernate代理的工作方式。我想要從具有額外行爲的現有持久化類派生出另一組持久化類。因此,如果我有一個名爲Product的類,我想生成一個名爲ProductOverride的代理類,它從Product派生,這會改變行爲,但也有稍微不同的數據庫映射。所以,我的問題更多地是關於DynamicProxy,而不是關於NHibernate。我意識到我可以通過代碼生成來實現這一點,但我寧願它在運行時發生。 – yonkz 2010-11-18 13:38:16

+0

爲什麼不使用標準的NHibernate繼承映射來實現這一點?爲什麼你甚至需要使用動態代理? – 2010-11-18 16:18:45

+0

因爲我不想維護這些類。我不想尋找替代設計。我有一些。手動創建實際類,通過代碼生成創建實際類。它們都會導致維護工作量增加一倍。我正在努力避免這種情況。 – yonkz 2010-11-18 17:23:10

相關問題