Как определить прототип перехватчиков с DefaultAdvisorAutoProxyCreator в Spring.NET - PullRequest
0 голосов
/ 12 февраля 2012

Я новичок в Spring.NET и просто пробую разные вещи. В рамках моего тестирования я создал простой объект:

public interface ICommand {
    void Execute(object context);
}

с одной реализацией:

public class ServiceCommand : ICommand {
    public ServiceCommand() {
        Console.WriteLine("########## {0} ##########", GetType().Name);
    }

    public void Execute(object context) {
        Console.WriteLine("Service implementation: {0}.{1}", GetType().Name, MethodBase.GetCurrentMethod().Name);
    }
}

Наконец, у меня есть простой совет:

public class ConsoleLoggingBeforeAdvice : IMethodBeforeAdvice {
    public ConsoleLoggingBeforeAdvice() {
        Console.WriteLine("########## {0} ##########", GetType().Name);
    }

    public void Before(MethodInfo method, object[] args, object target) {
        Console.WriteLine("Intercepted call to this method: {0}", method.Name);
        Console.WriteLine("     The target is             : {0}", target);
        Console.WriteLine("     The arguments are         : ");
        if (args != null) {
            foreach (object arg in args) {
                Console.WriteLine("\t: {0}", arg);
            }
        }
    }
}

Как видите, большая часть этого материала взята из примеров быстрого запуска Spring.NET.

Итак, я настроил ServiceCommand для переноса в ConsoleLoggingBeforeAdvice через ProxyFactoryObject и пометил оба объекта как прототип (см. Конфигурацию ниже). Это работает, как и ожидалось: каждый раз, когда мы запрашиваем ServiceCommand, создается новый экземпляр объекта и связанного с ним перехватчика:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
    <object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false">
        <property name="Advice">
            <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
        </property>
    </object>

    <object id="ServiceCommandTarget" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>

    <object id="ServiceCommand" type ="Spring.Aop.Framework.ProxyFactoryObject">
        <property name="IsSingleton" value="false"/>
        <property name="TargetName" value="ServiceCommandTarget"/>
        <property name="InterceptorNames">
            <list>
                <value>ConsoleLoggingBeforeAdvice</value>
            </list>
        </property>
    </object>
</objects>

Однако, когда я пытаюсь достичь тех же результатов через DefaultAdvisorAutoProxyCreator, все работает, за исключением того, что перехватчик всегда создается как Singleton (даже если он настроен как singleton = "false"). Конфиг выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net">
    <object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false">
        <property name="Advice">
            <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
        </property>
    </object>

    <object id="ServiceCommand" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>
    <object type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator"/>
</objects>

Теперь, как я могу гарантировать, что DefaultAdvisorAutoProxyCreator будет обрабатывать как объект, так и связанный с ним перехватчик?

1 Ответ

1 голос
/ 18 февраля 2012

ОК, я понял, что установка InterceptorNames в DefaultAdvisorAutoProxyCreator будет правильно создавать экземпляры перехватчиков как прототипов (если они настроены так).Но это почему-то кажется неправильным, поскольку DefaultAdvisorAutoProxyCreator должен иметь возможность выбирать перехватчики из советников и соблюдать их параметры конфигурации.

Я до сих пор не на 100% уверен в том, как создавать прототипы-перехватчики для различных сценариев.Например, все мои попытки создать перехватчики с областью потока при использовании DefaultAdvisorAutoProxyCreator потерпели неудачу.

В любом случае, вот конфигурация xml, которая работает для меня:

<?xml version="1.0" encoding="utf-8"?>
<objects xmlns="http://www.springframework.net" default-autowire="constructor">
    <object id="ConsoleLoggingBeforeAdvice" type="Spring.Aop.Support.DefaultPointcutAdvisor" singleton="false">
        <property name="Advice">
            <object type="Spring.Examples.AopQuickStart.ConsoleLoggingBeforeAdvice"/>
        </property>
    </object>

    <object id="ServiceCommand" type="Spring.Examples.AopQuickStart.ServiceCommand" singleton="false"/>

    <object type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator">
        <property name="InterceptorNames" value="ConsoleLoggingBeforeAdvice"/>
    </object>
</objects>

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

...