<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dev @ Work &#187; Inversion of Control</title>
	<atom:link href="http://www.devatwork.nl/tag/inversion-of-control/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.devatwork.nl</link>
	<description>A day in the life of a developer</description>
	<lastBuildDate>Tue, 18 Oct 2011 16:32:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Castle Windsor Component Messaging: Senders &amp; Receivers</title>
		<link>http://www.devatwork.nl/2007/06/castle-windsor-component-messaging-senders-receivers/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=castle-windsor-component-messaging-senders-receivers</link>
		<comments>http://www.devatwork.nl/2007/06/castle-windsor-component-messaging-senders-receivers/#comments</comments>
		<pubDate>Tue, 12 Jun 2007 20:55:04 +0000</pubDate>
		<dc:creator>Trilobyte</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Castle Project]]></category>
		<category><![CDATA[Messaging Facility]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windsor Container]]></category>
		<category><![CDATA[Inversion of Control]]></category>

		<guid isPermaLink="false">http://www.devatwork.nl/index.php/2007/06/12/castle-windsor-component-messaging-senders-receivers/</guid>
		<description><![CDATA[Here is some more information about the messaging framework I have been working on the last couple of weeks. Although I had less time to work on the framework then I had expected, I managed to get some work done on message filtering, but that is a subject for a next post. In this post [...]]]></description>
			<content:encoded><![CDATA[<p>Here is some more information about the messaging framework I have been working on the last couple of weeks. Although I had less time to work on the framework then I had expected, I managed to get some work done on message filtering, but that is a subject for a next post.</p>
<p>In this post I will explain how you implement a message sender and receiver class. I tried to keep the framework as simple as possible and I think I did a pretty good job, however if you have any comments or ideas, please let me know.</p>
<p>Anyway, enough talk, lets get down to business.</p>
<h2>Implementing a message sender</h2>
<p>Implementing a sender is very easy, there are two things to do: The first step is to implement the IMessageSender interface or derive from the SenderBase class. Then you need to decorate the sender class with the MessageSenderAttribute. That is it.</p>
<p>Example:</p>
<pre class="brush: csharp; title: ; notranslate">[MessageSender()]
public class TestSender: SenderBase
{
	public void SendMessage()
	{
		TestMessage msg = new TestMessage();
		base.DoSend(msg);
	}
}</pre>
<p>The TestMessage which is send in the example code does not contain any information, but you can define your own message class which contains any information you can imagine.</p>
<h2>Implementing a message receiver</h2>
<p>The implementation of a receiver class is not equal easy as the implementation of the sender class. There are two steps as well: The first step is to implement the IMessageReceiver interface and the second step is to decorate the class with the MessageReceiverAttribute.</p>
<p>Example:</p>
<pre class="brush: csharp; title: ; notranslate">[MessageReceiver()]
public class TestReceiver: IMessageReceiver
{
	public void Receive(IMessage message)
	{
		// do something with the message
	}
}</pre>
<p>The receive function will be called when a message is received.</p>
<p>Currently I am working on the implementation of the message filters. The idea is that you can do pre-processing on messages using some clean C# constructs. When I got an implementation ready I will post it on this weblog. That is it for now. See you next time.</p>

	Tags: <a href="http://www.devatwork.nl/tag/castle-project/" title="Castle Project" rel="tag">Castle Project</a>, <a href="http://www.devatwork.nl/tag/inversion-of-control/" title="Inversion of Control" rel="tag">Inversion of Control</a>, <a href="http://www.devatwork.nl/tag/windsor-container/" title="Windsor Container" rel="tag">Windsor Container</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.devatwork.nl/2007/06/castle-windsor-component-messaging-senders-receivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internal Messaging for Castle IoC Components</title>
		<link>http://www.devatwork.nl/2007/06/internal-messaging-for-castle-ioc-components/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=internal-messaging-for-castle-ioc-components</link>
		<comments>http://www.devatwork.nl/2007/06/internal-messaging-for-castle-ioc-components/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 09:37:04 +0000</pubDate>
		<dc:creator>Trilobyte</dc:creator>
				<category><![CDATA[Castle Project]]></category>
		<category><![CDATA[Messaging Facility]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windsor Container]]></category>
		<category><![CDATA[Inversion of Control]]></category>
		<category><![CDATA[MicroKernel]]></category>

		<guid isPermaLink="false">http://www.devatwork.nl/index.php/2007/06/01/internal-messaging-for-castle-ioc-components/</guid>
		<description><![CDATA[At the moment I am working on a framework which provides loose coupled internal messaging support for components that live in the Castle Windsor IoC container. This messaging framework stimulates the decoupling of components by providing loose coupled messages. The messages can be sent from any component that is declared to be a message sender [...]]]></description>
			<content:encoded><![CDATA[<p>At the moment I am working on a framework which provides loose coupled internal messaging support for components that live in the Castle Windsor IoC container. This messaging framework stimulates the decoupling of components by providing loose coupled messages.</p>
<p>The messages can be sent from any component that is declared to be a message sender to any component that is declared to be a message receiver. The components, for the senders, do not know to which components receive the message or, for the receivers, where the message originated from.</p>
<p>The messages contain Meta information describing the payload of the message. Currently I am working on the messages themselves. Here is an example of how you can extract information from a message without knowing its explicit content.</p>
<p>Firs we will create a message and its payload:</p>
<pre class="brush: csharp; title: ; notranslate">// creating the message and it's payload
Person person1			= new Person(&amp;amp;amp;quot;Bert&amp;amp;amp;quot;);
IContentMetaInfo metaInfo1	= new ContentMetaInfoBase(typeof(Person));
IContent content1			= new ContentBase(person1, metaInfo1);
Person person2			= new Person(&amp;amp;amp;quot;Trilobyte&amp;amp;amp;quot;);
IContentMetaInfo metaInfo2	= new ContentMetaInfoBase(typeof(Person));
IContent content2			= new ContentBase(person2, metaInfo2);
MessageBase msg			= new MessageBase(new IContent[] {content1,content2});</pre>
<p>Image the message is send to somewhere and then take a look at the receive code below:</p>
<pre class="brush: csharp; title: ; notranslate">// get the payload from the message
foreach (IContent personContent in msg.FindContentByMetaInfo(delegate (IContentMetaInfo inf) {return inf.ContentType == typeof(Person);}))
{
	// process the person content
	Person p	= (Person)personContent.Content;
	Console.WriteLine(p.Name);
}</pre>
<p>As you can see, I only extracted the data I discovered, for all I know the message contains tons of other information, but I do not care about that.</p>
<p>Although my current implementation is not completed yet and there is a lot of stuff still to do, I really wanted to share this sample with you, because I think this method is a good way to decrease coupling between components in the system.</p>
<p>I will keep working on the framework as much as I can, so expect more information about it soon. In the mean time reactions about ideas, questions or comments are very welcome!</p>

	Tags: <a href="http://www.devatwork.nl/tag/castle-project/" title="Castle Project" rel="tag">Castle Project</a>, <a href="http://www.devatwork.nl/tag/inversion-of-control/" title="Inversion of Control" rel="tag">Inversion of Control</a>, <a href="http://www.devatwork.nl/tag/microkernel/" title="MicroKernel" rel="tag">MicroKernel</a>, <a href="http://www.devatwork.nl/tag/windsor-container/" title="Windsor Container" rel="tag">Windsor Container</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.devatwork.nl/2007/06/internal-messaging-for-castle-ioc-components/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inversion of Control</title>
		<link>http://www.devatwork.nl/2007/03/inversion-of-control/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=inversion-of-control</link>
		<comments>http://www.devatwork.nl/2007/03/inversion-of-control/#comments</comments>
		<pubDate>Mon, 26 Mar 2007 17:47:48 +0000</pubDate>
		<dc:creator>Trilobyte</dc:creator>
				<category><![CDATA[Castle Project]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Windsor Container]]></category>
		<category><![CDATA[Inversion of Control]]></category>
		<category><![CDATA[MicroKernel]]></category>

		<guid isPermaLink="false">http://www.devatwork.nl/index.php/2007/03/26/inversion-of-control/</guid>
		<description><![CDATA[Ik ben sinds enige tijd bezig met het ontwikkelen van een softwarepakket met behulp van een Inversion of Control container en ik ben er erg enthousiast over, vandaar deze post. Om maar bij het begin te beginnen: Wat is Inversion of Control? IoC wordt meestal gebruikt in een raamwerk om deze uitbreidbaar te maken voor [...]]]></description>
			<content:encoded><![CDATA[<p>Ik ben sinds enige tijd bezig met het ontwikkelen van een softwarepakket met behulp van een Inversion of Control container en ik ben er erg enthousiast over, vandaar deze post.</p>
<p><span id="more-16"></span></p>
<p><strong>Om  maar bij het begin te beginnen: Wat is Inversion of Control?</strong><br />
IoC wordt meestal gebruikt in een raamwerk om deze uitbreidbaar te maken voor ontwikkelaars. Het basis principe is dat het raamwerk weet van de uitbreidingen en deze zelf aanroept. Dit in tegenstelling tot de traditionele API waar de uitbreiding ontwikkelaar het raamwerk aanroept. Dat betekent concreet dat het raamwerk de baas is. Oftewel de rollen zijn omgedraaid.Voor andere definities, zie bronner: [<a href="#1">1</a>], [<a href="#3">3</a>] en [<a href="#4">4</a>].</p>
<p><strong>Inversion of Control container?</strong><br />
Het IoC patroon wordt meestal geÃ¯mplementeerd met behulp van een IoC container. Deze container bevat een register van alle componenten in het hele systeem. Dit register is verantwoordelijk voor het creÃ«ren en opruimen van de componenten als ook het bijhouden van de configuratie en de afhankelijkheden van andere componenten. Dit reduceert de koppeling tussen de diverse component, met als gevolg dat ze makkelijker herbruikbaar, te onderhouden en te testen zijn.</p>
<p>Zoals je misschien hebt opgemerkt maakt de IoC container gebruik van het Dependency Injection patroon om de componenten zo los mogelijk van elkaar te houden.</p>
<p><strong>Waarom is IoC zo geweldig?</strong><br />
IoC stelt je als ontwikkelaar in staat om gemakkelijk afhankelijkheden en configuratie te beheren Doordat koppelingen voorkomen kunnen worden, kan de ontwikkelaar zich richten op zijn eigen taak zonder zich druk hoeft te maken over allerlei afhankelijkheden. Het onderhouden en testen van code is eenvoudiger en ook kunnen componenten gemakkelijker opnieuw gebruikt worden.</p>
<p>Doordat afhankelijkheden in de configuratie geregeld worden, kun je als applicatie beheerder gemakkelijk onderdelen vervangen door andere onderdelen zonder dat er een programmeur aan te pas hoeft te komen.</p>
<p>Dit alles heeft tot gevolg dat softwareprojecten eenvoudiger worden en met grotere zekerheid uitgevoerd kunnen worden, iets waar iedereen voordeel van heeft.</p>
<p><strong>Welke IoC container te gebruiken?</strong><br />
Er zijn verschillende implementaties van IoC containers voor verschillende platformen. Zelf gebruik ik WindsorContainer uit het Castle Project [<a href="#2">2</a>]. Deze container werkt op het .NET platform, mijn favoriete ontwikkelomgeving. Ik ben er pas een aantal weken mee aan het werk en ik ving het geweldig werken, nou zal ik niet beweren dat Windsor de beste is omdat het de enige IoC container is die ik tot nog toe gebruikt heb.</p>
<p>Mocht iemand ervaring hebben met een andere IoC containers, geef dan je mening in een reactie op deze post.</p>
<p>Op de wikipedia pagina over IoC [<a href="#1">1</a>] staat een overzicht van een aantal IoC containers gesorteerd op platform en taal.</p>
<p><strong>Voorbeeld:</strong><br />
Het onderstaande voorbeeld maakt gebruik van de WindsorContainer van het Castle Project. Het is een eenvoudig voorbeeld puur gericht om het IoC principe te demostreren. De onderstaande code is ook niet compleet. Klik <a href="http://www.devatwork.nl/wp-content/uploads/2007/03/iocsample.zip">hier</a> om de hele code te downloaden.</p>
<p>Klasse diagram van het model:</p>
<p><img src="http://www.devatwork.nl/wp-content/uploads/2007/03/ioc.jpg" alt="IoC Classes" id="image19" /></p>
<p>Configuratie:</p>
<p><img src="http://www.devatwork.nl/wp-content/uploads/2007/03/config.gif" alt="IoC Config" id="image18" /></p>
<p>De configuratie specificeert twee componenten: De MessageFactory en de SmtpSender. De SmtpSender wordt geinitialiseerd met de gespecificeerde host name en port (zie constructor van de SmtpSender klasse).</p>
<p>Code:</p>
<p><img src="http://www.devatwork.nl/wp-content/uploads/2007/03/code.gif" alt="IoC Code" id="image17" /></p>
<p>De code is, zoals je kunt zien, erg eenvoudig. De code bestaat uit een viertal delen: Het eerste deel creÃ«ert en configureert de IoC container. Het volgende code gedeelte bestaat uit twee stappen: Het ophalen van de IMessageFactory implementatie klasse uit de IoC container en het creÃ«ren van het bericht. Het derde deel haalt eerst de IMessageSender implementatie klasse op, om vervolgens daarmee het bericht te versturen. En tot slot het laatste deel dat niks anders doet dan opruimen. Dat is alles!</p>
<p>Inversion of Control is, naar mijn mening, een krachtig principe dat er voor zorgt dat je op een totaal andere manier software gaat ontwikkelen. Het ontwikkelen met behulp van het IoC principe even wennen is, het vergt namelijk een andere denkwijze, maar mijn ervaring is dat je na een paar kleine test applicaties, je het principe goed onder de knie hebt en de kracht optimaal kan benutten.</p>
<p>Dat is het wel weer voor deze post, en volgende posts over dit onderwerp zal ik wat meer op de details ingaan. Ik hoop dat je deze post leuk en nuttig vond om te lezen! Als je nog vragen of opmerkingen hebt dan hoor ik het graag!</p>
<p><strong>Bronnen</strong></p>
<table border="0" cellpadding="2" cellspacing="0">
<tr>
<td>[<a title="1" name="1"></a>1]</td>
<td><a href="http://en.wikipedia.org/wiki/Inversion_of_control">Wikepedia over Inversion of Control</a></td>
</tr>
<tr>
<td>[<a title="2" name="2"></a>2]</td>
<td><a href="http://www.castleproject.org/">Castle Project</a></td>
</tr>
<tr>
<td>[<a title="3" name="3"></a>3]</td>
<td><a href="http://www.betaversion.org/~stefano/linotype/news/38/">Stefano Mazzocchi over Inversion of Control</a></td>
</tr>
<tr>
<td>[<a title="4" name="4"></a>4]</td>
<td><a href="http://www.martinfowler.com/articles/injection.html">Martin Fowler over Inversion of Control</a></td>
</tr>
</table>

	Tags: <a href="http://www.devatwork.nl/tag/castle-project/" title="Castle Project" rel="tag">Castle Project</a>, <a href="http://www.devatwork.nl/tag/inversion-of-control/" title="Inversion of Control" rel="tag">Inversion of Control</a>, <a href="http://www.devatwork.nl/tag/microkernel/" title="MicroKernel" rel="tag">MicroKernel</a>, <a href="http://www.devatwork.nl/tag/windsor-container/" title="Windsor Container" rel="tag">Windsor Container</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.devatwork.nl/2007/03/inversion-of-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

