<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>eventaggregator Wiki Rss Feed</title><link>https://eventaggregator.codeplex.com/</link><description>eventaggregator Wiki Rss Description</description><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=29</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;[ &lt;a href="https://github.com/timothy-makarov/AsyncEventAggregator"&gt;Asynchronous Event Aggregator&lt;/a&gt; ]&lt;/h1&gt;C# .NET TPL Based Event Aggregator with Subscribe/Publish Interface
&lt;hr /&gt;

&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Sat, 02 Feb 2013 10:42:35 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130202104235A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=28</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;[ &lt;a href="https://github.com/timothy-makarov/AsyncEventAggregator"&gt;Async Event Aggregator&lt;/a&gt; ]&lt;/h1&gt;C# .NET TPL Based Event Aggregator with Subscribe/Publish Interface
&lt;hr /&gt;

&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Sat, 02 Feb 2013 10:41:55 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130202104155A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=27</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Tue, 22 Jan 2013 18:22:44 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130122062244P</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=26</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Mon, 21 Jan 2013 09:06:44 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130121090644A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=25</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;br /&gt; &lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Mon, 21 Jan 2013 09:05:51 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130121090551A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=24</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Mon, 21 Jan 2013 09:05:25 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130121090525A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=23</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system.&lt;br /&gt;See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>timothy_makarov</author><pubDate>Mon, 21 Jan 2013 09:05:05 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20130121090505A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=22</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system! See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Wed, 19 Dec 2012 14:29:20 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20121219022920P</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=21</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; depending on the system! See &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Wed, 19 Dec 2012 14:03:33 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20121219020333P</guid></item><item><title>Updated Wiki: EventAggregatorPerfTest</title><link>http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;version=5</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;Performance Test&lt;/h2&gt;
&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366005" alt="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 1.&lt;/b&gt; Time dependency of a single event processing from total processed event count for one sender and one subscriber.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366006" alt="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 2.&lt;/b&gt; Time dependecy of total processing time from total processed event count  for one sender and one subscriber.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366029" alt="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 3.&lt;/b&gt; Time dependecy of a single event processing from total processed event count for one sender and multiple receivers.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366030" alt="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 4.&lt;/b&gt; Time dependecy of total processing time from total processed event count for one sender and multiple receivers.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Wed, 04 Jul 2012 08:01:22 GMT</pubDate><guid isPermaLink="false">Updated Wiki: EventAggregatorPerfTest 20120704080122A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=20</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. You can see for yourself the &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;performance test results&lt;/a&gt; for &lt;b&gt;Event Aggregator&lt;/b&gt;. Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; no matter how many senders or subscribers you have!&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Wed, 04 Jul 2012 07:57:21 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120704075721A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=19</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. You can see for yourself the performance test results for &lt;b&gt;Event Aggregator&lt;/b&gt;.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; no matter how many senders or subscribers you have!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366005" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366006" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366029" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366030" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;More information can be found here at &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;Event Aggregator Performance Test Page&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Mon, 04 Jun 2012 10:45:59 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120604104559A</guid></item><item><title>Updated Wiki: SubscribeExtension</title><link>http://eventaggregator.codeplex.com/wikipage?title=SubscribeExtension&amp;version=6</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Subscribe extension method&lt;/h1&gt;Subscribes the caller instance to an event with specified ID.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Subscribe extension method signature&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
public static EventMessageHandler Subscribe(this object eventSource, EventHub eventHub, int id, Action&amp;lt;EventMessage&amp;gt; handler)
&lt;/pre&gt;&lt;br /&gt;Input arguments
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventSource&lt;/b&gt; is an instance of the object, which provides the event handler&lt;/li&gt;
&lt;li&gt;&lt;b&gt;eventHub&lt;/b&gt; is an object that manages event messaging&lt;/li&gt;
&lt;li&gt;&lt;b&gt;id&lt;/b&gt; is an event message identifier&lt;/li&gt;
&lt;li&gt;&lt;b&gt;handler&lt;/b&gt; is an event message handler&lt;/li&gt;&lt;/ul&gt;
Return value
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventMessageHandler&lt;/b&gt; is an instance of the EventMessageHandler class&lt;/li&gt;&lt;/ul&gt;

&lt;h2&gt;Example&lt;/h2&gt;Subscribe MainWindow to EventId.Default.Dispatch event ID and use HandleDispatch method as event message handler.&lt;br /&gt;&lt;br /&gt;Get message parameter &amp;quot;Dispatch&amp;quot; and use its value as an Action delegate to invoke a method in the Dispatcher.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.Dispatch, HandleDispatch);
        }

        private void HandleDispatch(EventMessage eventMessage)
        {
            Dispatcher.Invoke(eventMessage.GetValue&amp;lt;Action&amp;gt;(&amp;quot;Dispatch&amp;quot;));
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Thu, 19 Apr 2012 18:17:49 GMT</pubDate><guid isPermaLink="false">Updated Wiki: SubscribeExtension 20120419061749P</guid></item><item><title>Updated Wiki: SubscribeExtension</title><link>http://eventaggregator.codeplex.com/wikipage?title=SubscribeExtension&amp;version=5</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Subscribe extension method&lt;/h1&gt;Subscribes the caller instance to an event with specified ID.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Subscribe extension method signature&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
public static EventMessageHandler Subscribe(this object eventSource, EventHub eventHub, int id, Action&amp;lt;EventMessage&amp;gt; handler)
&lt;/pre&gt;&lt;br /&gt;Input arguments
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventSource&lt;/b&gt; is an instance of the object, which provides the event handler&lt;/li&gt;
&lt;li&gt;&lt;b&gt;id&lt;/b&gt; is an event message identifier&lt;/li&gt;
&lt;li&gt;&lt;b&gt;handler&lt;/b&gt; is an event message handler&lt;/li&gt;
&lt;li&gt;&lt;b&gt;eventHub&lt;/b&gt; is an object that manages event messaging&lt;/li&gt;&lt;/ul&gt;
Return value
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventMessageHandler&lt;/b&gt; is an instance of the EventMessageHandler class&lt;/li&gt;&lt;/ul&gt;

&lt;h2&gt;Example&lt;/h2&gt;Subscribe MainWindow to EventId.Default.Dispatch event ID and use HandleDispatch method as event message handler.&lt;br /&gt;&lt;br /&gt;Get message parameter &amp;quot;Dispatch&amp;quot; and use its value as an Action delegate to invoke a method in the Dispatcher.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.Dispatch, HandleDispatch);
        }

        private void HandleDispatch(EventMessage eventMessage)
        {
            Dispatcher.Invoke(eventMessage.GetValue&amp;lt;Action&amp;gt;(&amp;quot;Dispatch&amp;quot;));
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Thu, 19 Apr 2012 18:15:53 GMT</pubDate><guid isPermaLink="false">Updated Wiki: SubscribeExtension 20120419061553P</guid></item><item><title>Updated Wiki: SendExtension</title><link>http://eventaggregator.codeplex.com/wikipage?title=SendExtension&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Send extension method&lt;/h1&gt;Send extension method is used to notify subscribed observers that event happened.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Send extension method signature&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
public static EventMessage Send(this object eventSource, EventHub eventHub, int id, params KeyValuePair&amp;lt;string, object&amp;gt;[] parameters)
&lt;/pre&gt;&lt;br /&gt;Input arguments
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventSource&lt;/b&gt; is an event source, i.e. the object that sends an event message&lt;/li&gt;
&lt;li&gt;&lt;b&gt;eventHub&lt;/b&gt; is an object that manages event messaging&lt;/li&gt;
&lt;li&gt;&lt;b&gt;id&lt;/b&gt; is an event message identifier&lt;/li&gt;
&lt;li&gt;&lt;b&gt;parameters&lt;/b&gt; are optional parameters providing data for event handlers&lt;/li&gt;&lt;/ul&gt;
Return value
&lt;ul&gt;&lt;li&gt;&lt;b&gt;eventMessage&lt;/b&gt; is an instance of the sended message processed by all subscribed handlers&lt;/li&gt;&lt;/ul&gt;

&lt;h2&gt;Example&lt;/h2&gt;Send an event message with Dispatch ID (int this example EventId.settings file defines parameter with key &amp;quot;Dispatch&amp;quot; and some integer number as a value).&lt;br /&gt;&lt;br /&gt;Provide event message with specified delegate as an event argument (parameter key &amp;quot;Dispatch&amp;quot; and parameter value is an Action delegate).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
this.Send(EventId.Default.Dispatch,
  new KeyValuePair&amp;lt;string, object&amp;gt;(
    &amp;quot;Dispatch&amp;quot;,
    new Action(() =&amp;gt; IsExecutable = eventMessage.GetValue&amp;lt;bool&amp;gt;(&amp;quot;WorkIsDone&amp;quot;))));
&lt;/pre&gt;&lt;br /&gt;All subscribers to specified event ID (EventId.Default.Dispatch) will receive this event message.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Thu, 19 Apr 2012 18:13:13 GMT</pubDate><guid isPermaLink="false">Updated Wiki: SendExtension 20120419061313P</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=18</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance&lt;/h2&gt;It is very fast. You can see for yourself the performance test results for &lt;b&gt;Event Aggregator&lt;/b&gt;.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; (&lt;i&gt;delivery time&lt;/i&gt;) no matter how many senders or subscribers you have!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366005" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366006" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366029" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366030" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;More information can be found here at &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;Event Aggregator Performance Test Page&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Thu, 12 Apr 2012 10:36:31 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120412103631A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=17</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;&lt;h2&gt;Description&lt;/h2&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Simple&lt;/h2&gt;You can fire up any type of event.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;App.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            Current.MainWindow = new MainWindow();

            this.Send(EventId.Default.AppStartup);
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;Handle fired event whenever you need.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;MainWindow.xaml.cs&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
using System.Windows;
using EventAggregator;

namespace EventAggregatorSample
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Subscribe(EventId.Default.AppStartup, HandleAppStartup);
        }

        private void HandleAppStartup(EventMessage eventMessage)
        {
            Show();
        }
    }
}
&lt;/pre&gt;&lt;br /&gt;It is simple and makes no couplings between modules.&lt;br /&gt;
&lt;h2&gt;Performance Test&lt;/h2&gt;It is very fast. You can see for yourself the performance test results for &lt;b&gt;Event Aggregator&lt;/b&gt;.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; (&lt;i&gt;delivery time&lt;/i&gt;) no matter how many senders or subscribers you have!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366005" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366006" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366029" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366030" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;More information can be found here at &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;Event Aggregator Performance Test Page&lt;/a&gt;.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Thu, 12 Apr 2012 10:34:01 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120412103401A</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=16</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;
&lt;br /&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Performance Test&lt;/h2&gt;
You can see for yourself the performance test results for &lt;b&gt;Event Aggregator&lt;/b&gt;.&lt;br /&gt;Single event processing takes &lt;b&gt;25-30 μs&lt;/b&gt; no matter how many senders or subscribers you have!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366005" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366006" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366029" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366030" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;More information can be found here at &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;Event Aggregator Performance Test Page&lt;/a&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Tue, 10 Apr 2012 17:52:43 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120410055243P</guid></item><item><title>Updated Wiki: EventAggregatorPerfTest</title><link>http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;h2&gt;Performance Test&lt;/h2&gt;
You can see for yourself the performance results for Event Aggregator.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366005" alt="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 1.&lt;/b&gt; Time dependency of a single event processing from total processed event count for one sender and one subscriber.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366006" alt="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 2.&lt;/b&gt; Time dependecy of total processing time from total processed event count  for one sender and one subscriber.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366029" alt="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Single&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 3.&lt;/b&gt; Time dependecy of a single event processing from total processed event count for one sender and multiple receivers.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;DownloadId=366030" alt="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" title="Total&amp;#32;Event&amp;#32;Processing&amp;#32;Time" /&gt;&lt;br /&gt;&lt;b&gt;Figure 4.&lt;/b&gt; Time dependecy of total processing time from total processed event count for one sender and multiple receivers.&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Tue, 10 Apr 2012 17:48:38 GMT</pubDate><guid isPermaLink="false">Updated Wiki: EventAggregatorPerfTest 20120410054838P</guid></item><item><title>Updated Wiki: Home</title><link>http://eventaggregator.codeplex.com/wikipage?version=15</link><description>&lt;div class="wikidoc"&gt;&lt;h1&gt;Loosely coupled design with message coupling and event aggregation&lt;/h1&gt;
&lt;br /&gt;One of the key aspects in application design is managing dependencies between modules. Good architecture might begin to suffer from strong coupling as long as the project grows. All this affects further development by making it harder to change modules &amp;#40;a change in one module usually forces a ripple effect of changes in other modules&amp;#41;, also strongly coupled modules are harder to reuse and test.&lt;br /&gt;&lt;br /&gt;Message coupling is a good choice in developing loosely coupled architecture. This is the loosest type of coupling. It can be achieved by state decentralization and module communication is done via message passing.&lt;br /&gt;&lt;br /&gt;The Event Aggregator aggregates events from multiple objects into itself, passing that same event onto its observers.&lt;br /&gt;&lt;br /&gt;Event Aggregator project allows you to use event aggregation via extension methods, so you do not have to implement extra interfaces in order to support event aggregation in your code. Event Aggregator implements observer pattern and dispose pattern to manage event messaging, making your code more flexible and easier to test.&lt;br /&gt;
&lt;h2&gt;Performance Test&lt;/h2&gt;
You can see for yourself the performance test results for &lt;b&gt;Event Aggregator&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366005" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366006" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366029" alt="Single Event Processing Time" title="Single Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://i3.codeplex.com/Download?ProjectName=eventaggregator&amp;amp;DownloadId=366030" alt="Total Event Processing Time" title="Total Event Processing Time" /&gt;&lt;br /&gt;&lt;br /&gt;More information can be found here at &lt;a href="http://eventaggregator.codeplex.com/wikipage?title=EventAggregatorPerfTest&amp;referringTitle=Home"&gt;Event Aggregator Performance Test Page&lt;/a&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>DarkVasya</author><pubDate>Tue, 10 Apr 2012 17:30:32 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20120410053032P</guid></item></channel></rss>