Я новичок в 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 будет обрабатывать как объект, так и связанный с ним перехватчик?