Шрифт:
<<<IN>>> parameters: (
}
===System.MarshalByRefObject, mscorlib, Version=1.0.3300.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089
InitializeLifetimeservice
<<<OUT>>> parameters: (
}
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<IN>>> parameters: {
sum= 5
'
clientProcessId= 192)
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<IN>>> parameters: {
sum= 5
'
clientProcessId= 165)
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<OUT>>> parameters: {
}
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<OUT>>> parameters: {
}
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<IN>>> parameters: {
sum= 5
'
clientProcessId= 192)
===clr: SPbU.AOP_NET.Account, MyServer
Add
<<<OUT>>> parameters: {
}
Компоненты размещаются в двух контекстах, но в одном домене синхронизации
Закомментируем атрибут Synchronization , приписанный классу Account. Теперь, просматривая вывод на консоль сервера, можно заметить, что компонент Account размещается в контексте 1, а компоненты Tax и News в контексте 2:
Server is listening
News context = 2 News constructor thread = 9 IsPoolThread = True
Tax context = 2 Tax constructor thread = 9 IsPoolThread = True
Account context = 1 Account constructor thread = 9 IsPoolThread = True
…….
Просматривая файл LogFile видим, что теперь перехватываются вызовы к компонентам Tax и News, поступающие от компонента Account:
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
ctor
<<<IN>> parameters: {
}
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
ctor
<<<OUT>>> parameters: {
}
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
Notify
<<<IN>>> parameters: {
msg= new Account operation: +5)
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
Notify
}
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
get_news
<<<IN>>> parameters: {
}
===SPbU.AOP_NET.Tax, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
get_news
<<<OUT>>> parameters: {
}
===SPbU.AOP_NET.News, MyServer, Version=0.0.).0,
Culture=neutral, PublicKeyToken=null
Notify
<<<IN>>> parameters: {
msg= direct notification from Account)
===SPbU.AOP_NET.News, MyServer, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
Notify
<<<OUT>>> parameters: {
}
В рамках данного эксперимента мы покажем, что оба контекста синхронизации размещаются в одном домене синхронизации. Для этого необходимо показать, что ссылка на свойство синхронизации во втором контексте указывает на свойство синхронизации первого контекста, т. е. оба контекста совместно используют одно свойство синхронизации (одну очередь работ и т. д.).
Внесем в код сервера следующие дополнения:
namespace SPbU.AOP_NET {
……
public class Account: ContextBoundObject, IAccumulator,
IAudit, IAccumulatorNew{
……
public Account {
……
SynchronizationAttribute syncProperty =
(SynchronizationAttribute)
Thread.CurrentContext.GetProperty {
"Synchronization");
Console.WriteLine {
"Account syncProperty == Tax syncProperty "+
Object.ReferenceEquals(syncProperty, _tax.syncProperty));