2010-11-17 2 views
2

Кто-нибудь знает, можно ли управлять именами типов, сгенерированных с помощью функции Castle DynamicProxy? Я надеялся воспользоваться возможностью сохранить сборку, сгенерированную Castle, чтобы добавить некоторые дополнительные классы с некоторыми конкретными функциями для моего проекта, но я хотел бы иметь возможность управлять именами этих сгенерированных типов прокси. Любая помощь будет принята с благодарностью.Занесенные имена классов DynamicProxy в Castle DynamicProxy

Я действительно планирую сохранять экземпляры этих классов, а также экземпляры исходных классов, которые являются источниками прокси с NHibernate. Поэтому мне нужно, чтобы эти имена были согласованными между несколькими поколениями сборки.

ответ

3

Я сделал некоторые интересные копания. Указание имен прокси-серверов представляется возможным с помощью INamingScope, но для того, чтобы вставить INamingScope, вам нужно создать собственный ProxyFactoryFactory, который создаст ProxyFactory, идентичный NHibernate.ByteCode.Castle.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

+0

Я дам этот снимок в ближайшие пару дней и дам вам знать, как это происходит. – yonkz

+0

Sneaky очень sneaky;) Вы правильно отметили, что __it далеко не прямолинейный, и по какой-то причине. Это не предназначалось для переоценки.В любом случае, если вы это сделаете, есть предположение (не помните, если было зарегистрировано), что область именования будет последовательной - для данного 'предлагаемогоName' она всегда ** возвращает одно и то же уникальное имя (очевидно, оно должно быть уникальным, поэтому снова , если вы дважды вызываете метод, он должен всегда возвращать одно и то же второе значение и т. д.). От этого зависит процесс десериализации. –

0

Взгляните на проект ProxyGenerators в NHContrib. Он позволяет предварительно генерировать ленивые загрузочные прокси-серверы NHibernate.

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

ли вы использовать ProxyGenerators или нет, интегрировать свой собственный прокси Into NHibernate через Proxy Factory Factory. В 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

+0

Почему вы не используете стандартные сопоставления наследования NHibernate для этого? Почему вам даже нужно возиться с динамическими прокси? –

+0

Потому что я не хочу поддерживать эти классы. Я не ищу альтернативный дизайн. У меня есть несколько. Создание фактических классов вручную, создание фактических классов с помощью генерации кода. Все они приводят к удвоению усилий по техобслуживанию. Я хочу избежать этого. – yonkz