<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Dan's Development Blog</title>
    <description>A blog about code and human factors.</description>
    <link>http://www.d80.co.uk/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.1.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.d80.co.uk/opml.axd</blogChannel:blogRoll>
    <dc:creator>Dan Swain</dc:creator>
    <dc:title>Dan's Development Blog</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dan-swains-blog" /><feedburner:info uri="dan-swains-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>dan-swains-blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fdan-swains-blog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><item>
      <title>Rhino Mocks Stub Ref Parameter</title>
      <description>&lt;p&gt;A quick tip here, we've just spent what felt like ages trying to Stub a method with a &lt;strong&gt;ref&lt;/strong&gt; parameter using RhinoMocks, you'll also need NUnit for the code below to work.&lt;/p&gt;
&lt;p&gt;The problem we had was for the .Ref() method we needed an &lt;strong&gt;AbstractContraint&lt;/strong&gt;&amp;nbsp;but the normal &lt;strong&gt;Is.Anything&lt;/strong&gt;&amp;nbsp;didn't work, but if you use:&amp;nbsp;&lt;strong&gt;Rhino.Mocks.Constraints.Is.Anything()&lt;/strong&gt; it works fine.&lt;/p&gt;
&lt;h2&gt;RhinoMocks Stub with a Ref Parameter Example&lt;/h2&gt;
&lt;pre class="brush: c-sharp;"&gt;using NUnit.Framework;
using Rhino.Mocks;

namespace RhinoRef
{
	[TestFixture]
    public class RhinoMockRefTests
    {
		[Test]
		public void Should_be_able_to_stub_a_ref_parameter_in_rhino_mocks()
		{
			var repo = MockRepository.GenerateStub();

			repo.Stub(r =&amp;gt; r.Get(Arg.Is.Anything, ref Arg.Ref(Rhino.Mocks.Constraints.Is.Anything(), 0).Dummy))
				.Return("StubQuestion");

			int theAnswer = 42;
			var theQuestion = repo.Get("anything", ref theAnswer);
			Assert.That(theQuestion,Is.EqualTo("StubQuestion"));
		}
    }

	public interface IGetThingsOutOfTheDatabase
	{
		string Get(string name, ref int awkwardParameter);
	}
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=oguVpHmaReU:SiuCko0x6E8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/oguVpHmaReU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/oguVpHmaReU/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/05/10/Rhino-Mocks-Stub-Ref-Parameter.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=49c5aac5-2ab3-4871-b0ba-843a09e505e2</guid>
      <pubDate>Fri, 10 May 2013 23:48:00 +1000</pubDate>
      <category>c#</category>
      <category>tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=49c5aac5-2ab3-4871-b0ba-843a09e505e2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=49c5aac5-2ab3-4871-b0ba-843a09e505e2</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/05/10/Rhino-Mocks-Stub-Ref-Parameter.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=49c5aac5-2ab3-4871-b0ba-843a09e505e2</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=49c5aac5-2ab3-4871-b0ba-843a09e505e2</feedburner:origLink></item>
    <item>
      <title>DIP - The Dependency Inversion Principle</title>
      <description>&lt;p&gt;Here it is the final SOLID principle the Dependency Inversion Principle. In this brief video we'll talk about Robert Martin's premise that:&lt;/p&gt;
&lt;p&gt;A. High-level modules should not depend on low-level modules. Both should depend on abstractions.&lt;br /&gt; B. Abstractions should not depend upon details. Details should depend upon abstractions.&lt;/p&gt;
&lt;p&gt;
&lt;object width="853" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/DZvFTnbUK3E?hl=en_GB&amp;amp;version=3" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="853" height="480" src="http://www.youtube.com/v/DZvFTnbUK3E?hl=en_GB&amp;amp;version=3" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;h2&gt;Shoutout&lt;/h2&gt;
&lt;p&gt;The opening drawing of 'inverted dependents' was originally by &lt;a href="https://twitter.com/timmusgrove"&gt;Tim Musgrove&lt;/a&gt;, it made me laugh, full credit to him for that :)&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 1.5em;"&gt;SOLID Principles&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The SOLID principles are namely.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.d80.co.uk/post/2013/03/04/SRP-The-Single-Responsibility-Principle-in-5-minutes.aspx"&gt;SRP - Single Responsibility Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.d80.co.uk/post/2013/03/18/The-Open-Closed-Principle-in-5-minutes.aspx"&gt;OCP - Open Closed Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.d80.co.uk/post/2013/04/05/LSP-The-Liskov-Substitution-Principle-in-5-minutes.aspx"&gt;LSP - Liskov Substitution Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.d80.co.uk/post/2013/04/23/ISP-The-Interface-Segregation-Principle.aspx"&gt;ISP - Interface Segreation Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.d80.co.uk/post/2013/05/06/DIP-The-Dependency-Inversion-Principle.aspx"&gt;DIP - Dependency Inversion Principle&lt;/a&gt;&lt;/li&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=KmtqMLOMNu8:SUMs0BkQzdU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/KmtqMLOMNu8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/KmtqMLOMNu8/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/05/06/DIP-The-Dependency-Inversion-Principle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=77c889cd-238f-465e-b073-eefb7d9af788</guid>
      <pubDate>Mon, 06 May 2013 00:54:00 +1000</pubDate>
      <category>design patterns</category>
      <category>solid principles</category>
      <category>tutorial</category>
      <category>video tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=77c889cd-238f-465e-b073-eefb7d9af788</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=77c889cd-238f-465e-b073-eefb7d9af788</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/05/06/DIP-The-Dependency-Inversion-Principle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=77c889cd-238f-465e-b073-eefb7d9af788</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=77c889cd-238f-465e-b073-eefb7d9af788</feedburner:origLink></item>
    <item>
      <title>I will measure this by</title>
      <description>&lt;p&gt;As a [role], I want [requirement] So that [reason], this particular arrangement of words will be familiar to any agile team. Our board is littered with cards in this format. We tend to then have acceptance criteria in the &lt;a href="http://dannorth.net/introducing-bdd/"&gt;BDD style of given when then&lt;/a&gt;. We sometimes differentiate and have &lt;a href="http://www.romanpichler.com/blog/user-stories/epics-and-ready-stories/"&gt;Epics for the higher level stories&lt;/a&gt; but it's all very familiar.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right;" src="http://www.d80.co.uk/image.axd?picture=2013%2f5%2fi-will-measure-this-by.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;In the last few companies I've worked we've been increasingly talking about the "the measure of success", initially this was a notion and merely stated vaguely, this should improve conversion rates. Or improve the customer experience. Or everyone's favourite improve revenue. But this was the so that&amp;nbsp;the reason for the story. In some cases we would have 2 so that's. The first was for the websites visitor So that i can buy music&amp;nbsp;and then we'd have a second so that the company can increase its revenue. Thus linking it back to the businesses driver. I liked this small addition, because it helped us keep sight of the underlying business value&amp;nbsp;that we were trying to deliver.&lt;/p&gt;
&lt;h2&gt;Build measure learn&lt;/h2&gt;
&lt;p&gt;One book that had heavily influenced my thinking of late has been &lt;a href="http://theleanstartup.com/"&gt;The Lean Startup by Eric Ries&lt;/a&gt; the build measure learn cycle just makes a lot of sense.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lean.st/principles/build-measure-learn"&gt;&lt;img src="http://lean.st/images/startup-feedback-loop1.png?1315940898" alt="" width="250" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think there's s disconnect between the user stories we write, features we build and what we measure. In the lean startup they talk about validating features.A story has to go live to be validated but we don't have this on our board. Your definition of done is in production, feature delivered, but does that go far enough?&lt;/p&gt;
&lt;p&gt;A new feature isn't an instant hit, we provide an API when we deploy a new endpoint it takes time for partners to integrate with it. Simple things like counters can throw some much needed light and give us a good indication of how many partners are using the new endpoint as our measure of success.&lt;/p&gt;
&lt;h2&gt;I will measure this by&lt;/h2&gt;
&lt;p&gt;The important thing about measuring success is that you need generally to measure an improvement so if you aren't measuring this thing in the first place you need to get some metrics in as a basis for comparison. It also starts you thinking about what are they key metrics for your company and what are the key metrics for your team and how do they relate to the company KPIs then going forward how does a story feedback into those metrics?&lt;/p&gt;
&lt;p&gt;Therefore I'd like to propose an addition to the user story format, namely&amp;nbsp;I will measure this by. This encourages us to ask how are we going to know whether we've truly delivered the business value, which the so that&amp;nbsp;implies, if it's revenue then put a counter on for revenue from PayPal in the below example. You will then be able to confidentally say you've added business value. The card mentions comparing this against overall revenue and we're concerned with overall revenue increasing so it's entirely possible that PayPal won't increase overall revenue but just take away from the other credit card method. But we should see this because we define it in out I will measure this by.&lt;/p&gt;
&lt;p&gt;As a &amp;lt;role&amp;gt;&lt;br /&gt; I want &amp;lt;requirement&amp;gt;&lt;br /&gt; So that &amp;lt;value&amp;gt;&lt;br /&gt; And I will measure this by &amp;lt;measure of success&amp;gt;&lt;br /&gt;&lt;br /&gt; Thanks and please try writing a story in this format and see how it goes.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=hT_7xX2osM8:1dSgGXwXr0M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/hT_7xX2osM8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/hT_7xX2osM8/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/05/03/I-will-measure-this-by.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=bde830bc-e7e1-42cb-9226-883b79d2fa02</guid>
      <pubDate>Fri, 03 May 2013 06:22:00 +1000</pubDate>
      <category>agile</category>
      <category>Human Factors</category>
      <category>lean startup</category>
      <category>opinion</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=bde830bc-e7e1-42cb-9226-883b79d2fa02</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=bde830bc-e7e1-42cb-9226-883b79d2fa02</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/05/03/I-will-measure-this-by.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=bde830bc-e7e1-42cb-9226-883b79d2fa02</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=bde830bc-e7e1-42cb-9226-883b79d2fa02</feedburner:origLink></item>
    <item>
      <title>What the Customer Cares about</title>
      <description>&lt;p&gt;Do you know what your customers care about? Recently I've been conducting short 30 minute interviews with various internal customers to try and learn a bit more about what they care about, what they worry about, their aspirations for the future and frustrations with the present. It's been quite enlightening and has yielded both great ideas worth persuing and humbling truths worth hearing.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right;" src="http://www.d80.co.uk/image.axd?picture=2013%2f4%2fwhat-the-customer-cares-about.png" alt="" /&gt;Strangely in software development we seem to be insulated from our customers. Our project might be about "boosting revenue" or "improving efficiency" but that's often all we know. We'll have received this mission from a product owner who might be a proxy for the real departmental customer, if we're really lucky we'll have a real person from the actual department we're doing a piece of work for.&lt;/p&gt;
&lt;p&gt;So let me ask a question, how much do you know about your customers? What does their team care about, who are their customers and what teams do they most often interact with. Book a quick meeting in with them, for an informal chat, I simply sent an informat email saying that I'd like to learn more about their team and would they mind if I interviewed them briefly. I attached the questions I was likely to ask (see below) and if they were up for it I'd book a meeting.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.d80.co.uk/file.axd?file=2013%2f4%2fWhat_the_customer_cares_about.pdf"&gt;Here's my rough format&lt;/a&gt;, I'll send an email entitled:&lt;/p&gt;
&lt;h2&gt;A quick interview to help YOUR TEAM understand a little more about CUSTOMERS TEAM eg Sales / Marketing.&lt;/h2&gt;
&lt;p&gt;I'll attach the following questions to give them a heads-up and time to ponder some anwers.&lt;/p&gt;
&lt;h2&gt;So tell me about CUSTOMERS TEAM.&lt;/h2&gt;
&lt;p&gt;A nice opener, everyone sees themselves in a unique light. A sales teams might not consider themselves about revenue but about helping their clients deliver fantastic service using your product.&lt;/p&gt;
&lt;h2&gt;What are the components of CUSTOMERS TEAM at YOUR COMPANY, sub-teams, areas.&lt;/h2&gt;
&lt;p&gt;Do you know how your customers team is organised? Are they split by country or function. For example if it's marketing is there an SEO team and a Social Media team? Does copyrighting come under SEO or are they something different. Do they have teams around your companies different brands? Is the brand team under marketing or are they separate again?&lt;/p&gt;
&lt;h2&gt;Who are your customers / stakeholders&lt;/h2&gt;
&lt;p&gt;Who are your customers, customers? It is always good to see who your customer is trying to keep happy. Do copyrighting interact with legal a lot or is the SEO team the more important stakeholder in new articles written, the more you can understand your customers predicament the more you can write code that keeps their customers happy and hence your customers happy.&lt;/p&gt;
&lt;h2&gt;What teams do you often interact with, who do you depend on?&lt;/h2&gt;
&lt;p&gt;Are customer services always working with the web support team over customers having forgotten their password, maybe it's about time you put a 'forgot my password' button on the page. Wouldn't that make everyone's lifes easier.&lt;/p&gt;
&lt;h2&gt;What are the key measurements you worry about.&lt;/h2&gt;
&lt;p&gt;Is it revenue for sales? Prehaps churn rate or ARPU for marketing. Operations are likely to care about uptime, but what about Customer Services? Is it number of open queries or the average time to a query being resolved?&lt;/p&gt;
&lt;h2&gt;What are you measured by, and who measures you.&lt;/h2&gt;
&lt;p&gt;For sales you can imagine it being revenue related and probably by the CFO or CEO, but prehaps this assumption is wrong. If customer services are measured by the length a customer problem takes to solve and there's a very common problem that's very time consuming to fix, a bit of work from a development team can have a massive effect on their KPI's.&lt;/p&gt;
&lt;h2&gt;Where do you want to be in 6 months.&lt;/h2&gt;
&lt;p&gt;Are Customer Services hoping to move off some internal tool and onto some externally hosted CRM platform. What are they hoping this will give them, is there anything you can do to help? Or anything that might go wrong that they're unaware of.&lt;/p&gt;
&lt;h2&gt;If YOUR TEAM&amp;nbsp;could do one thing for you what would it be.&lt;/h2&gt;
&lt;p&gt;You're not promising anything but it gives you a really good idea of your customers priorities and what they perceive as the big issues. I've been shocked to find them say it's not the project we're about to start. Apparently that was someone higher ups idea. All they want is a small feature and that'll be more than enough to help them achieve their goals. I've heard feature suggestions that are simply brilliant and not even that hard to implement and walked out thinking why didn't we think of that or why don't we have that feature we must have a 'forgot my password' link surely customers don't have to fill out a contact us form.&lt;/p&gt;
&lt;h2&gt;If Technology could do one thing for you what would it be.&lt;/h2&gt;
&lt;p&gt;Same as above but for your department. This is always a good one because it puts what they'd love from you in context with other bits of your department. "What we'd love is if we could let our Phones and Tablets on the internal network so we can test that our microsites look good on mobile devices before we go live". Ok I can talk to the network guys I'm sure they can sort that out in 10 seconds all our team do that for application feature testing anyway I can't see why you can't have the same access. It's amazing what silly little things you didn't think of can be such a big issue to other departments. I've learned we really take the privelege of being able to for example 'install chrome' &amp;nbsp;for granted as developers.&lt;/p&gt;
&lt;h2&gt;What are you excited about,.&lt;/h2&gt;
&lt;p&gt;It might be that new CRM system they've been after for months, they might be about to launch their first social media campaign, is there anything you can do to help them, or do you know another team that can. It's all about empathy and letting that inform all those millions of tiny decisions we make every day as we implement a feature or fix a bug.&lt;/p&gt;
&lt;p&gt;It seems tragic that in a world where software is everything and building the wrong software is an expensive endevour we do so little to try and empathise with our customers. I think it was&amp;nbsp;&lt;a href="http://forwardtechnology.co.uk/videos/32447325"&gt;Fred George&lt;/a&gt;&amp;nbsp;who pointed out that it is the large financial institutions that are quite used to getting programmers and traders working side by side, strangely in most modern 'agile' shops we have layers of people between 'customers' and 'developers'.&lt;/p&gt;
&lt;p&gt;So I implore you, go out and &lt;a href="http://www.d80.co.uk/file.axd?file=2013%2f4%2fWhat_the_customer_cares_about.pdf"&gt;interview your customers&lt;/a&gt; and get to know what they care about, and don't forget to share your interview notes with the rest of your team and even department it can only help you in producing software that helps achieve what the customer cares about.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.d80.co.uk/file.axd?file=2013%2f4%2fWhat_the_customer_cares_about.pdf"&gt;What_the_customer_cares_about.pdf (40.84 kb)&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=Faz233P4n2g:E4dcQmf_Obg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/Faz233P4n2g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/Faz233P4n2g/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/04/23/What-the-Customer-Cares-about.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=899a4f79-1184-4b00-8682-3e210f4ced3f</guid>
      <pubDate>Tue, 23 Apr 2013 07:04:00 +1000</pubDate>
      <category>Human Factors</category>
      <category>opinion</category>
      <category>rant</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=899a4f79-1184-4b00-8682-3e210f4ced3f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=899a4f79-1184-4b00-8682-3e210f4ced3f</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/04/23/What-the-Customer-Cares-about.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=899a4f79-1184-4b00-8682-3e210f4ced3f</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=899a4f79-1184-4b00-8682-3e210f4ced3f</feedburner:origLink></item>
    <item>
      <title>ISP - The Interface Segregation Principle</title>
      <description>&lt;p&gt;For the penultimate episode of my mini-series on the SOLID Principles we look at the Interface Segregation Principle or ISP which states:&lt;/p&gt;
&lt;blockquote&gt;No client should be forced to depend on methods it does not use.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;object width="853" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/3CtAfl7aXAQ?version=3&amp;amp;hl=en_GB" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="853" height="480" src="http://www.youtube.com/v/3CtAfl7aXAQ?version=3&amp;amp;hl=en_GB" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=o_Y41KIUJRc:Co3BeMMfnvA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/o_Y41KIUJRc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/o_Y41KIUJRc/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/04/23/ISP-The-Interface-Segregation-Principle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=1524384c-805b-4594-8da3-a751e0dcad04</guid>
      <pubDate>Tue, 23 Apr 2013 04:18:00 +1000</pubDate>
      <category>agile</category>
      <category>design patterns</category>
      <category>solid principles</category>
      <category>video tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=1524384c-805b-4594-8da3-a751e0dcad04</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=1524384c-805b-4594-8da3-a751e0dcad04</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/04/23/ISP-The-Interface-Segregation-Principle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=1524384c-805b-4594-8da3-a751e0dcad04</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=1524384c-805b-4594-8da3-a751e0dcad04</feedburner:origLink></item>
    <item>
      <title>LSP - The Liskov Substitution Principle in 5 minutes</title>
      <description>&lt;p&gt;So for the 3rd installment in my mini-series on the SOLID principles we have the Liskov Substitution Principle or LSP. In under 5 minutes we briskly talk about &lt;a href="http://en.wikipedia.org/wiki/Barbara_Liskov"&gt;Barbara Liskov&lt;/a&gt; and her assertion that:&lt;/p&gt;
&lt;blockquote&gt;if S is a subtype of T, then objects of type T may be replaced with objects of type S&lt;/blockquote&gt;
&lt;p&gt;What does that mean? well watch the video ;)&lt;/p&gt;
&lt;p&gt;
&lt;object width="853" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/Orhu0x5aplI?version=3&amp;amp;hl=en_GB" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="853" height="480" src="http://www.youtube.com/v/Orhu0x5aplI?version=3&amp;amp;hl=en_GB" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=OfLT_fohMRw:dt-eML9n0rQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/OfLT_fohMRw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/OfLT_fohMRw/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/04/05/LSP-The-Liskov-Substitution-Principle-in-5-minutes.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=541cd2c2-19db-44e3-a348-6c1b09e4a2e0</guid>
      <pubDate>Fri, 05 Apr 2013 19:17:00 +1000</pubDate>
      <category>design patterns</category>
      <category>tutorial</category>
      <category>video tutorial</category>
      <category>solid principles</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=541cd2c2-19db-44e3-a348-6c1b09e4a2e0</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=541cd2c2-19db-44e3-a348-6c1b09e4a2e0</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/04/05/LSP-The-Liskov-Substitution-Principle-in-5-minutes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=541cd2c2-19db-44e3-a348-6c1b09e4a2e0</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=541cd2c2-19db-44e3-a348-6c1b09e4a2e0</feedburner:origLink></item>
    <item>
      <title>Living with Legacy Code Talk</title>
      <description>&lt;p&gt;Well it happened, Leon and I actually did our little presentation at the &lt;a href="http://www.meetup.com/devs-in-the-ditch/"&gt;Devs it a Ditch meetup&lt;/a&gt;. Naturally there were a few technical difficulties (no sound), which prehaps is for the best, and thankfully resolved by the time the Raspberry Pi talk started (conspiracy theorists say what you will).&lt;/p&gt;
&lt;p&gt;Thanks to all involved in the preparation, Darrell, Chris, Paul, Nina, Georgy and the rest of the gang.&lt;/p&gt;
&lt;p&gt;here's the screencast, with audio :)&lt;/p&gt;
&lt;p&gt;
&lt;object width="853" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/oUsrN-3AyI8?version=3&amp;amp;hl=en_GB" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="853" height="480" src="http://www.youtube.com/v/oUsrN-3AyI8?version=3&amp;amp;hl=en_GB" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;here's the live broadcast, unfortunately without audio, but you get to see (and hear) Romilly talk about making robots with Raspberry Pi's&lt;/p&gt;
&lt;p&gt;
&lt;object width="560" height="315"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/W-5ReSb_Xk4?version=3&amp;amp;hl=en_US" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="560" height="315" src="http://www.youtube.com/v/W-5ReSb_Xk4?version=3&amp;amp;hl=en_US" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;Thank you for watching :)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=TNUemw1aA7w:i3ydHWipuus:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/TNUemw1aA7w" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/TNUemw1aA7w/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/03/22/Living-with-Legacy-Code-Talk.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=bb66c0f0-6a76-44e9-bda3-445d68ba0e3b</guid>
      <pubDate>Fri, 22 Mar 2013 20:15:00 +1000</pubDate>
      <category>Human Factors</category>
      <category>video tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=bb66c0f0-6a76-44e9-bda3-445d68ba0e3b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=bb66c0f0-6a76-44e9-bda3-445d68ba0e3b</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/03/22/Living-with-Legacy-Code-Talk.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=bb66c0f0-6a76-44e9-bda3-445d68ba0e3b</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=bb66c0f0-6a76-44e9-bda3-445d68ba0e3b</feedburner:origLink></item>
    <item>
      <title>RabbitMq with EasyNetQ Tutorial</title>
      <description>&lt;p&gt;I've been playing with &lt;a href="http://easynetq.com/"&gt;EasyNetQ&lt;/a&gt; recently as a gentle introduction to &lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;. Increasingly we seem to be thinking what our codebase would look like if implementted using message queues. Our hope is that it will make implementing lots of simple systems even easier.&lt;/p&gt;
&lt;h2&gt;The Video - (the written tutorial is below :)&lt;/h2&gt;
&lt;p&gt;
&lt;object width="640" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/CqxV_Xn4PlI?version=3&amp;amp;hl=en_GB" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="640" height="480" src="http://www.youtube.com/v/CqxV_Xn4PlI?version=3&amp;amp;hl=en_GB" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;h2&gt;Before we Begin, be sure you've got RabbitMQ&lt;/h2&gt;
&lt;p&gt;I've even made a little video on how to &lt;a href="http://www.d80.co.uk/post/2013/03/21/Setting-up-RabbitMq-on-Windows.aspx"&gt;install RabbitMQ with the Management Plugin on Windows&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/danswain/rabbitmq-with-easynetq-tutorial"&gt;source code for this tutorial&lt;/a&gt; is on GitHub to make life easier :)&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fRabbitMqScreenshot2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;You'll also need Visual Studio (i'm using vs2012) etc.&lt;/p&gt;
&lt;h2&gt;The Domain&lt;/h2&gt;
&lt;p&gt;We're going to be making a very simple ordering system for our fictional company &lt;strong&gt;IWantATesla.com&lt;/strong&gt; in the tradition of all modern web companies we'll be implementing a RESTish API that will receive an HTTP request and then &lt;strong&gt;Publish &lt;/strong&gt;an&amp;nbsp;&lt;strong&gt;Order&lt;/strong&gt;&amp;nbsp;for a &lt;strong&gt;Tesla Car&lt;/strong&gt;. Since demand is likely to be so high we might have to have &lt;em&gt;load balance&lt;/em&gt;&amp;nbsp;between various &lt;strong&gt;Subscribers&lt;/strong&gt;&amp;nbsp;who will then be able &lt;strong&gt;process the order&lt;/strong&gt;&amp;nbsp;which might involve considerable work. From the API client perspective, we don't have to wait for all the processing to happen we can have a &lt;strong&gt;quick response&lt;/strong&gt;&amp;nbsp;that just &lt;strong&gt;acknowledges the order was received&lt;/strong&gt;&amp;nbsp;and then we can go about are lives knowing at somepoint soonish we'll probably get a receipt or order confirmation email or something.&lt;/p&gt;
&lt;h2&gt;Step 1 - New WebApi Project&lt;/h2&gt;
&lt;p&gt;Create a new Solution (we're gong to need several projects for this). Create a new &lt;strong&gt;ASP.NET MVC 4 Web Application&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fMvc4WebProject.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;of the &lt;strong&gt;WebApi&lt;/strong&gt;&amp;nbsp;variety for good measure.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fMvc4WebProjectWebApi.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Step 2 - Install EasyNetQ&lt;/h2&gt;
&lt;p&gt;Right easy bit nice and simple&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fEasyNetQ.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Step 3 - Create a Class Library Project&lt;/h2&gt;
&lt;p&gt;Ok this might seem stupid, but in order (pun?) to ultimately share a message between our WebApi project which will be our &lt;strong&gt;Publisher&lt;/strong&gt; and a console app (which we'll get to shortly) which will be our&lt;strong&gt; subscriber&lt;/strong&gt; we need to have a common type that both can understand. EasyNetQ in it's opinionated way thinks we need to at a minimum use a .Net type as a message and I'm inclined to agree. So what we're going to do is create a very minimumal &lt;strong&gt;Class&amp;nbsp; Library Project&lt;/strong&gt; called &lt;strong&gt;IWantATesla.Messages&lt;/strong&gt; and then reference from within our WebApi project and then our console app subscriber. This project will have 1 class (I said it was minimal) called &lt;strong&gt;TeslaOrder&lt;/strong&gt; and it looks like this.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;namespace IWantATesla.Messages
{
	public class TeslaOrder
	{
		public string CustomerEmail { get; set; }
		public string Model { get; set; }
		public string Color { get; set; }
	}
}&lt;/pre&gt;
&lt;h2&gt;Step 4 - Create a new ApiController&lt;/h2&gt;
&lt;p&gt;Now back to the &lt;strong&gt;WebApi&lt;/strong&gt; project, firstly reference the &lt;strong&gt;IWantATesla.Messages&lt;/strong&gt; project you just created above. Next we create a new ApiController&amp;nbsp; below is some code. If we create a controller and inherit from &lt;strong&gt;ApiController&lt;/strong&gt;&amp;nbsp;like the below &lt;strong&gt;OrderController&lt;/strong&gt;&amp;nbsp;it'll by default correspond to the path &lt;strong&gt;http://localhost:portnumber/api/order&lt;/strong&gt;&amp;nbsp;where &lt;strong&gt;order&lt;/strong&gt;&amp;nbsp;corresponds to &lt;strong&gt;OrderController&lt;/strong&gt;. In our simple code below we're only going to handle the &lt;strong&gt;POST&lt;/strong&gt;&amp;nbsp;response where we hand back a &lt;strong&gt;HttpResponseMessage&lt;/strong&gt;&amp;nbsp;which is always &lt;strong&gt;Created&lt;/strong&gt;&amp;nbsp;(we hardcoded that in).&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;using System.Net;
using System.Net.Http;
using System.Web.Http;
using EasyNetQ;
using IWantATesla.Messages;

namespace IWantATesla.WebApi.Controllers
{
	public class OrderController : ApiController
	{
		// POST api/values
		public HttpResponseMessage Post([FromBody] TeslaOrder order)
		{
			var messageBus = RabbitHutch.CreateBus("host=localhost");

			using(var publishChannel = messageBus.OpenPublishChannel())
			{
				publishChannel.Publish(order);
			}
			return Request.CreateResponse(HttpStatusCode.Created);
		}		 
	}
}&lt;/pre&gt;
&lt;p&gt;But there's some magic EasyNetQ stuff in here to. You'll note we create a &lt;strong&gt;RabbitHutch.CreateBus("host=localhost")&lt;/strong&gt;, just the name rabbit hutch always makes me smile. So it's here that we're connecting to our running RabbitMQ server (please make sure it's up and running), but it's very simple. We realy on WebApi magic to bind the &lt;strong&gt;TeslaOrder&lt;/strong&gt; from the POST request that comes in and then we simply, have a &lt;strong&gt;using()&lt;/strong&gt; statement (the publish channel must be disposed afterwards), and we call&amp;nbsp; &lt;strong&gt;messageBus.OpenPublishChannel()&lt;/strong&gt; what this does is create an &lt;strong&gt;Exchange&lt;/strong&gt; on RabbitMQ called &lt;strong&gt;IWantATesla_Messages_TeslaOrder:IWantATesla_Messages&lt;/strong&gt; and then we call &lt;strong&gt;pubishChannel.Publish(order)&lt;/strong&gt; which sends the message to the RabbitMQ Exchange.&lt;/p&gt;
&lt;h2&gt;Step 5 - Create a Console App Project called OrderProccessor&lt;/h2&gt;
&lt;p&gt;Yes I'm afraid we need another project. As above you'll need to use &lt;strong&gt;Nuget to reference EasyNetQ&lt;/strong&gt; and you'll also want add a project reference to &lt;strong&gt;IWantATesla.Messages&lt;/strong&gt;. Once you've done that we're ready to write our rediculously simple &lt;strong&gt;subscriber&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Actually we're not going to do the absolute simplest thing we're going to do a little bit more just to make our subscribers output a little less cluttered. Lets start with the code below:&lt;/p&gt;
&lt;pre class="brush: c-sharp;"&gt;using System;
using EasyNetQ;
using IWantATesla.Messages;

namespace OrderProcessor
{
	class Program
	{
		static void Main(string[] args)
		{
		    var logger = new LogNothingLogger();
			var bus = RabbitHutch.CreateBus("host=localhost",reg=&amp;gt;reg.Register&amp;lt;IEasyNetQLogger&amp;gt;(log=&amp;gt;logger));

			bus.Subscribe&amp;lt;TeslaOrder&amp;gt;("my_subscription_id", msg =&amp;gt;
			{
				Console.WriteLine("Processing Order: {0} -- Model: {1} -- Color: {2}",
                    msg.CustomerEmail,
                    msg.Model,
                    msg.Color);				
			});
		}
	}

    public class LogNothingLogger : IEasyNetQLogger
    {
        public void DebugWrite(string format, params object[] args)
        {
        }

        public void InfoWrite(string format, params object[] args)
        {
        }

        public void ErrorWrite(string format, params object[] args)
        {
        }

        public void ErrorWrite(Exception exception)
        {
        }
    }
}&lt;/pre&gt;
&lt;p&gt;So first off you'll see there's 2 classes here, the first is our Console app called &lt;strong&gt;Program&lt;/strong&gt; and the second is the &lt;strong&gt;LogNothingLogger&lt;/strong&gt; which doesn't do anything as the name and code imply.&lt;/p&gt;
&lt;p&gt;If you look at the &lt;strong&gt;Program&lt;/strong&gt; class you can see we construct our empty logging class and call if &lt;strong&gt;logger&lt;/strong&gt;. We then as with the &lt;strong&gt;Publish WebApi&lt;/strong&gt; above create a &lt;strong&gt;RabbitHutch.CreateBus&lt;/strong&gt; only this time in addition to the connection string to our locally running RabbitMQ instance we pass in lambda that says we want to &lt;strong&gt;Register&amp;lt;IEasyNetQLogger&amp;gt;(log=&amp;gt;logger)&lt;/strong&gt; which just says that we want to use our &lt;strong&gt;LogNothingLogger&lt;/strong&gt; class for logging instead of the default one. The default one writes lots of debugging output to the &lt;strong&gt;stdout&lt;/strong&gt; which of course is the same as what our subscriber console app will write to so to mimimise confusion we override it doing nothing and have a nice clean subscriber console output.&lt;/p&gt;
&lt;p&gt;So moving on, you can se we call &lt;strong&gt;bus.Subscribe&amp;lt;TeslaOrder&amp;gt;("my_subscription_id", Action&amp;lt;TeslaOrder&amp;gt;)&lt;/strong&gt; where &lt;strong&gt;my_subscription_id&lt;/strong&gt; gets appended to the name of a queue so if we look at the &lt;strong&gt;Queues&lt;/strong&gt; in RabbitMQ you'll see a queue called &lt;strong&gt;IWantATesla_Messages_TeslaOrder:IWantATesla_Messages_my_subscription_id&lt;/strong&gt;. For the &lt;strong&gt;Action&amp;lt;TeslaOrder&amp;gt;&lt;/strong&gt; you'll see another lambda where we expect to be given a &lt;strong&gt;TeslaOrder&lt;/strong&gt; and then we simply Console.WriteLine it out to the stdout. That's it for the subscriber now lets see if it all works.&lt;/p&gt;
&lt;h2&gt;Step 6 - Multiple Startup Project&lt;/h2&gt;
&lt;p&gt;Just to make this easy if you &lt;strong&gt;right click on the solution&lt;/strong&gt; and do &lt;strong&gt;properties&lt;/strong&gt; you'll get the below dialog. If you change the action of the &lt;strong&gt;WebApi&lt;/strong&gt; project and the &lt;strong&gt;OrderProcessor&lt;/strong&gt; console app both to &lt;strong&gt;start&lt;/strong&gt; you'll get them both fire up at the same time to make things easy.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fSolutionPropertyPage.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Then run all the things...&lt;/p&gt;
&lt;h2&gt;Step 7 - Post an Order&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;So at this point you should have a WebApi app up and running (though without having implented GET it's hard to know. Install a plugin like&lt;a href="https://chrome.google.com/webstore/detail/dev-http-client/aejoelaoggembcahagimdiliamlcdmfm?hl=en"&gt; Dev HTTP Client&lt;/a&gt; to give your endpoint a poke.&lt;/p&gt;
&lt;p&gt;you should also have an empty console app sitting there to. Ok lets give that endpoint a prod. We're going to use a &lt;strong&gt;Form Post&lt;/strong&gt; like below.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fPostToOrderCar.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;make sure you set it to &lt;strong&gt;POST&lt;/strong&gt;&amp;nbsp;and set the Content-Type to&amp;nbsp;&lt;strong&gt;application/x-www-form-urlencoded&lt;/strong&gt;&amp;nbsp;you should of-course probably prefer json or xml but just to keep things simple.&lt;/p&gt;
&lt;p&gt;Notice the C# code always returns created even though it doesn't do  anything, but if you were to write something else you'd find the WebApi  is kindly doing the deserialisation for you.&lt;/p&gt;
&lt;p&gt;Not only should you get a &lt;strong&gt;201 Created&lt;/strong&gt; back but you should also see:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fOrderProcessorOutput001.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;That's it you've done it, you've successfully got a REST service to put messages on a RabbitMQ queue using EasyNetQ which are then processed by separate apps that simply &lt;strong&gt;subscribe&lt;/strong&gt; to the the queue. Fantastic.&lt;/p&gt;
&lt;h2&gt;Step 8 - Little Bonus of RabbitMQ&lt;/h2&gt;
&lt;p&gt;Here's a nice little feature of RabbitMQ if you just go to the &lt;strong&gt;bin\Debug&lt;/strong&gt; folder and fire up another instance of the &lt;strong&gt;OrderProcessor&lt;/strong&gt; console app (the subscriber) and then change the color in the Post app and post again, then repeat, you'll start to notice that RabbitMQ automatically &lt;strong&gt;round-robins&lt;/strong&gt; the requests between the subscribers. So in essence &lt;strong&gt;free load-balancing&lt;/strong&gt; which could be very handy especially if you consider how popular Tesla's seem to be (I wonder how long the real queue for a Tesla Model S is).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.d80.co.uk/image.axd?picture=2013%2f3%2fOrderProcessorOutput-RoundRobin.png" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That's it really, there's a few things I should point out, when we created the bus in the WebApi OrderController we would probably prefer to have it injected in using an IOC container. I believe everytime you do this it creates another connection to RabbitMQ and keeps it open so prehaps a &lt;strong&gt;singleton&lt;/strong&gt; for it. that's all thanks for now and be sure to checkout the &lt;a href="http://easynetq.com/"&gt;EasyNetQ website&lt;/a&gt; and &lt;a href="https://github.com/mikehadlow/EasyNetQ"&gt;GitHub&lt;/a&gt; project (the documentations really good) not to mention the RabbitMQ site which is also really good.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=RrbVZow_y1o:vpOIBylSA_c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/RrbVZow_y1o" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/RrbVZow_y1o/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/03/21/RabbitMq-with-EasyNetQ-Tutorial.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=5ee794c2-5a8b-41cb-8480-38afe6fb1082</guid>
      <pubDate>Thu, 21 Mar 2013 20:59:00 +1000</pubDate>
      <category>c#</category>
      <category>rabbitmq</category>
      <category>tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=5ee794c2-5a8b-41cb-8480-38afe6fb1082</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=5ee794c2-5a8b-41cb-8480-38afe6fb1082</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/03/21/RabbitMq-with-EasyNetQ-Tutorial.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=5ee794c2-5a8b-41cb-8480-38afe6fb1082</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=5ee794c2-5a8b-41cb-8480-38afe6fb1082</feedburner:origLink></item>
    <item>
      <title>Setting up RabbitMq on Windows</title>
      <description>&lt;p&gt;I've been playing with EasyNetQ and RabbitMQ recently and I thought I'd make a little precursor video to my EasyNetQ tutorial just to go through setting up RabbitMq on a Windows box. It's really not that hard, the Management console bit is the only bit that some might find annoying. Anywhere here it is:&lt;/p&gt;
&lt;p&gt;
&lt;object width="640" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/x9wwZAuub1w?version=3&amp;amp;hl=en_GB" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="640" height="480" src="http://www.youtube.com/v/x9wwZAuub1w?version=3&amp;amp;hl=en_GB" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;Thanks again Dan&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=R19XseAuM3o:OqogxbJbI1g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/R19XseAuM3o" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/R19XseAuM3o/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/03/21/Setting-up-RabbitMq-on-Windows.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=cbb696fd-f54b-4592-8eae-69439e204027</guid>
      <pubDate>Thu, 21 Mar 2013 09:47:00 +1000</pubDate>
      <category>tutorial</category>
      <category>video tutorial</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=cbb696fd-f54b-4592-8eae-69439e204027</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=cbb696fd-f54b-4592-8eae-69439e204027</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/03/21/Setting-up-RabbitMq-on-Windows.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=cbb696fd-f54b-4592-8eae-69439e204027</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=cbb696fd-f54b-4592-8eae-69439e204027</feedburner:origLink></item>
    <item>
      <title>The Open Closed Principle in 5 minutes.</title>
      <description>&lt;p&gt;Following on from the Single Responsibility Principle, we have the second of the SOLID Principle the Open Closed Principle or OCP.&lt;/p&gt;
&lt;p&gt;
&lt;object width="853" height="480"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/JLURCz3dDtY?hl=en_GB&amp;amp;version=3" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="853" height="480" src="http://www.youtube.com/v/JLURCz3dDtY?hl=en_GB&amp;amp;version=3" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;The Open Closed Principle states that classes should be &lt;strong&gt;open for extension&lt;/strong&gt; but &lt;strong&gt;closed for modification&lt;/strong&gt;. It has a long history originally coming for Bertrand Meyer in his book on Object Orientated software construction. In his book he tended to use a base class that base functionality that was then modified by inheritance. Nowadays we tend to use interfaces as the base abstraction so we can completely change behaviour by swapping out any classes implementation.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/dan-swains-blog?a=nMbPBHOfbpQ:KokjRoHTXBU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/dan-swains-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/dan-swains-blog/~4/nMbPBHOfbpQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/dan-swains-blog/~3/nMbPBHOfbpQ/post.aspx</link>
      <author>dan</author>
      <comments>http://www.d80.co.uk/post/2013/03/18/The-Open-Closed-Principle-in-5-minutes.aspx#comment</comments>
      <guid isPermaLink="false">http://www.d80.co.uk/post.aspx?id=438c70c4-8f3d-4fc9-987d-d6bd33f5e642</guid>
      <pubDate>Mon, 18 Mar 2013 02:48:00 +1000</pubDate>
      <category>tutorial</category>
      <category>video tutorial</category>
      <category>solid principles</category>
      <dc:publisher>dan</dc:publisher>
      <pingback:server>http://www.d80.co.uk/pingback.axd</pingback:server>
      <pingback:target>http://www.d80.co.uk/post.aspx?id=438c70c4-8f3d-4fc9-987d-d6bd33f5e642</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.d80.co.uk/trackback.axd?id=438c70c4-8f3d-4fc9-987d-d6bd33f5e642</trackback:ping>
      <wfw:comment>http://www.d80.co.uk/post/2013/03/18/The-Open-Closed-Principle-in-5-minutes.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.d80.co.uk/syndication.axd?post=438c70c4-8f3d-4fc9-987d-d6bd33f5e642</wfw:commentRss>
    <feedburner:origLink>http://www.d80.co.uk/post.aspx?id=438c70c4-8f3d-4fc9-987d-d6bd33f5e642</feedburner:origLink></item>
  </channel>
</rss>
