Замок DynamicProxy генерирует имена классов - PullRequest
2 голосов
/ 17 ноября 2010

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

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

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Я сделал несколько интересных раскопок.Задать имена прокси-серверов представляется возможным с помощью 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 голосов
/ 17 ноября 2010

Посмотрите на проект ProxyGenerators в NHContrib.Это позволяет вам предварительно генерировать отложенные загрузочные прокси 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>
...