<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Object Mentor Blog: Dependency Injection Inversion</title>
    <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Dependency Injection Inversion</title>
      <description>&lt;p&gt;Dependency Injection is all the rage.  There are several frameworks that will help you inject dependencies into your system.  Some use &lt;span class="caps"&gt;XML&lt;/span&gt; (God help us) to specify those dependencies.  Others use simple statements in code.  In either case, the goal of these frameworks is to help you create instances without having to resort to &lt;code&gt;new&lt;/code&gt; or Factories.&lt;/p&gt;


	&lt;p&gt;I think these frameworks are great tools.  But I also think you should carefully restrict how and where you use them.&lt;/p&gt;


	&lt;p&gt;Consider, for example, this simple example using Google&amp;#8217;s Guice framework.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
 public class BillingApplication {
   public static void main(String[] args) {
    Injector injector = Guice.createInjector(new BillingModule());
    BillingService billingService = injector.getInstance(BillingService.class);
    billingService.processCharge(2034, "Bob");
  }
 }
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;My goal is to create an instance of &lt;code&gt;BillingService&lt;/code&gt;.  To do this, I first get an &lt;code&gt;Injector&lt;/code&gt; from Guice.  Then I use the &lt;code&gt;injector&lt;/code&gt; to get an instance of my &lt;code&gt;BillingService&lt;/code&gt; class.  What&amp;#8217;s so great about this?  Well, take a look at the constructor of the &lt;code&gt;BillingService&lt;/code&gt; class.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
class BillingService {
  private CreditCardProcessor processor;
  private TransactionLog transactionLog;

  @Inject
  BillingService(CreditCardProcessor processor, TransactionLog transactionLog) {
    this.processor = processor;
    this.transactionLog = transactionLog;
  }

  public void processCharge(int amount, String id) {
    boolean approval = processor.approve(amount, id);
    transactionLog.log(
      String.format("Transaction by %s for %d %s",
      id, amount, approvalCode(approval)));
  }

  private String approvalCode(boolean approval) {
    return approval?"approved":"denied";
  }
}

&lt;/code&gt;&lt;/pre&gt;
Oh ho!  The &lt;code&gt;BillingService&lt;/code&gt; constructor requires two arguments!  A &lt;code&gt;CreditCardProcessor&lt;/code&gt; and a &lt;code&gt;TransactionLog&lt;/code&gt;.  How was the &lt;code&gt;main&lt;/code&gt; program able to create an instance of &lt;code&gt;BillingService&lt;/code&gt; without those two arguments?  That&amp;#8217;s the magic of Guice (and of all Dependency Injection frameworks).  Guice knows that the &lt;code&gt;BillingService&lt;/code&gt; needs those two arguments, and it knows how to create them.  Did you see that funky &lt;code&gt;@Inject&lt;/code&gt; attribute above the constructor?  That&amp;#8217;s how it got connected into Guice.

	&lt;p&gt;And here&amp;#8217;s the magic module that tells Guice how to create the arguments for the &lt;code&gt;BillingService&lt;/code&gt;&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class BillingModule extends AbstractModule {
  protected void configure() {
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);
    bind(CreditCardProcessor.class).to(MyCreditCardProcessor.class);
  }
}

&lt;/code&gt;&lt;/pre&gt;
Clever these Google-folk!  The two &lt;code&gt;bind&lt;/code&gt; functions tell Guice that whenever we need an instance of a &lt;code&gt;TransactionLog&lt;/code&gt; it should use an instance of &lt;code&gt;DatabaseTransactionLog&lt;/code&gt;.  Whenever it needs a &lt;code&gt;CreditCardProcessor&lt;/code&gt; it should use an instance of &lt;code&gt;MyCreditCardProcessor&lt;/code&gt;.

	&lt;p&gt;Isn&amp;#8217;t that cool!  Now you don&amp;#8217;t have to build factories.  You don&amp;#8217;t have to use &lt;code&gt;new&lt;/code&gt;.  You just tell Guice how to map interfaces to implementations, and which constructors to inject those implementations in to, and then call &lt;code&gt;Injector.getInstance(SomeClass.class);&lt;/code&gt; and voila!  You have your instance automatically constructed for you.  Cool.&lt;/p&gt;


	&lt;p&gt;Well, yes it&amp;#8217;s cool.  On the other hand, consider this code:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class BillingApplicationNoGuice {
  public static void main(String[] args) {
    CreditCardProcessor cp = new MyCreditCardProcessor();
    TransactionLog tl = new DatabaseTransactionLog();
    BillingService bs = new BillingService(cp, tl);
    bs.processCharge(9000, "Bob");
  }
}

&lt;/code&gt;&lt;/pre&gt; 
Why is this worse?  It seems to me it&amp;#8217;s better.

	&lt;p&gt;&lt;em&gt;But Uncle Bob&lt;/em&gt;, you&amp;#8217;ve violated &lt;span class="caps"&gt;DIP&lt;/span&gt; by creating concrete instances!&lt;/p&gt;


	&lt;p&gt;True, but you have to mention concrete instances somewhere.  &lt;code&gt;main&lt;/code&gt; seems like a perfectly good place for that.  Indeed, it seems better than hiding the concrete references in &lt;code&gt;BillingModule&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;I don&amp;#8217;t want a bunch of secret modules with &lt;code&gt;bind&lt;/code&gt; calls scattered all around my code.  I don&amp;#8217;t want to have to hunt for the particular &lt;code&gt;bind&lt;/code&gt; call for the &lt;code&gt;Zapple&lt;/code&gt; interface when I&amp;#8217;m looking at some module.  I want to know where all the instances are created.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;But Uncle Bob&lt;/em&gt;, You&amp;#8217;d know where they are because this is a &lt;em&gt;Guice&lt;/em&gt; application.&lt;/p&gt;


	&lt;p&gt;I don&amp;#8217;t want to write a &lt;em&gt;Guice&lt;/em&gt; application.  Guice is a framework, and I don&amp;#8217;t want framework code smeared all through my application.  I want to keep frameworks nicely decoupled and at arms-length from the main body of my code.  I don&amp;#8217;t want to have &lt;code&gt;@Inject&lt;/code&gt; attributes everywhere and &lt;code&gt;bind&lt;/code&gt; calls hidden under rocks.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;But Uncle Bob&lt;/em&gt;, What if I want to get an instance of &lt;code&gt;BillingService&lt;/code&gt; from deep in the bowels of my application?  With Guice I can just say &lt;code&gt;injector.getInstance(BillingService.class);&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;True, but I don&amp;#8217;t want to have &lt;code&gt;createInstance&lt;/code&gt; calls scattered all through my code.  I don&amp;#8217;t want Guice to be poured all over my app. I want my app to be clean, not soaked in Guice.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;But Uncle Bob&lt;/em&gt;, That means I have to use &lt;code&gt;new&lt;/code&gt; or factories, or pass globals around.&lt;/p&gt;


	&lt;p&gt;You think the &lt;code&gt;injector&lt;/code&gt; is not a global?  You think &lt;code&gt;BillingService.class&lt;/code&gt; is not a global?  There will always be globals to deal with.  You can&amp;#8217;t write systems without them.  You just need to manage them nicely.&lt;/p&gt;


	&lt;p&gt;And, no, I don&amp;#8217;t have to use &lt;code&gt;new&lt;/code&gt; everywhere, and I don&amp;#8217;t need factories.  I can do something as simple as:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class BillingApplicationNoGuice {
  public static void main(String[] args) {
    CreditCardProcessor cp = new MyCreditCardProcessor();
    TransactionLog tl = new DatabaseTransactionLog();
    BillingService.instance = new BillingService(cp, tl);

    // Deep in the bowels of my system.
    BillingService.instance.processCharge(9000, "Bob");
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;em&gt;But Uncle Bob&lt;/em&gt;, what if you want to create many instances of &lt;code&gt;BillingService&lt;/code&gt; rather than just that one singleton?

	&lt;p&gt;Then I&amp;#8217;d use a factory, like so:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class BillingApplication {
   public static void main(String[] args) {
    Injector injector = Guice.createInjector(new BillingModule());
    BillingService.factory = new BillingServiceFactory(injector);

    // Deep in the bowels of my code.
    BillingService billingService = BillingService.factory.make();
    billingService.processCharge(2034, "Bob");
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;em&gt;But Uncle Bob&lt;/em&gt;, I thought the whole idea was to avoid factories!

	&lt;p&gt;Hardly.  After all, Guice is just a big factory.  But you didn&amp;#8217;t let me finish.  Did you notice that I passed the Guice injector into the factory?  Here&amp;#8217;s the factory implementation.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
public class BillingServiceFactory extends AbstractModule {
  private Injector injector;

  public BillingServiceFactory(Injector injector) {
    this.injector = injector;
  }

  protected void configure() {
    bind(TransactionLog.class).to(DatabaseTransactionLog.class);
    bind(CreditCardProcessor.class).to(MyCreditCardProcessor.class);
  }

  public BillingService make() {
    return injector.getInstance(BillingService.class);
  }
}

&lt;/code&gt;&lt;/pre&gt;
I like this because now all the Guice is in one well understood place.  I don&amp;#8217;t have Guice all over my application.  Rather, I&amp;#8217;ve got factories that contain the Guice.  Guicey factories that keep the Guice from being smeared all through my application.  

	&lt;p&gt;What&amp;#8217;s more, if I wanted to replace Guice with some other DI framework, I know exactly what classes would need to change, and how to change them.  So I&amp;#8217;ve kept Guice uncoupled from my application.&lt;/p&gt;


	&lt;p&gt;Indeed, using this form allows me to defer using Guice until I think it&amp;#8217;s necessary.  I can just build the factories the good old &lt;span class="caps"&gt;GOF&lt;/span&gt; way until the need to externalize dependencies emerges.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;But Uncle Bob&lt;/em&gt;, don&amp;#8217;t you think Dependency Injection is a good thing?&lt;/p&gt;


	&lt;p&gt;Of course I do.  Dependency Injection is just a special case of Dependency Inversion.  I think Dependency Inversion is so important that I want to invert the dependencies on Guice!  I don&amp;#8217;t want lots of concrete Guice dependencies scattered through my code.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;BTW&lt;/span&gt;, did you notice that I was using Dependency Injection even when I wasn&amp;#8217;t using Guice at all?  This is nice and simple &lt;em&gt;manual&lt;/em&gt; dependency injection.  Here&amp;#8217;s that code again in case you don&amp;#8217;t want to look back:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;

public class BillingApplicationNoGuice {
  public static void main(String[] args) {
    CreditCardProcessor cp = new MyCreditCardProcessor();
    TransactionLog tl = new DatabaseTransactionLog();
    BillingService bs = new BillingService(cp, tl);
    bs.processCharge(9000, "Bob");
  }
}

&lt;/code&gt;&lt;/pre&gt;
Dependency Injection doesn&amp;#8217;t require a framework; it just requires that you invert your dependencies and then construct and pass your arguments to deeper layers.   Consider, for example, that the following test works just fine in &lt;em&gt;all&lt;/em&gt; the cases above.  It does not rely on Guice, it only relies on the fact that dependencies were inverted and can be injected into &lt;code&gt;BillingService&lt;/code&gt;

&lt;pre&gt;&lt;code&gt;

public class BillingServiceTest {
  private LogSpy log;

  @Before
  public void setup() {
    log = new LogSpy();
  }

  @Test
  public void approval() throws Exception {
    BillingService bs = new BillingService(new Approver(), log);
    bs.processCharge(9000, "Bob");
    assertEquals("Transaction by Bob for 9000 approved", log.getLogged());
  }

  @Test
  public void denial() throws Exception {
    BillingService bs = new BillingService(new Denier(), log);
    bs.processCharge(9000, "Bob");
    assertEquals("Transaction by Bob for 9000 denied", log.getLogged());    
  }
}

class Approver implements CreditCardProcessor {
  public boolean approve(int amount, String id) {
    return true;
  }
}

class Denier implements CreditCardProcessor {
  public boolean approve(int amount, String id) {
    return false;
  }
}

class LogSpy implements TransactionLog {
  private String logged;

  public void log(String s) {
    logged = s;
  }

  public String getLogged() {
    return logged;
  }
}

&lt;/code&gt;&lt;/pre&gt;
Also notice that I rolled my own Test Doubles (we used to call them mocks, but we&amp;#8217;re not allowed to anymore.)  It would have been tragic to use a mocking framework for such a simple set of tests.

	&lt;p&gt;Most of the time the best kind of Dependency Injection to use, is the manual kind.  Externalized dependency injection of the kind that Guice provides is appropriate for those classes that you &lt;em&gt;know&lt;/em&gt; will be extension points for your system.&lt;/p&gt;


	&lt;p&gt;But for classes that aren&amp;#8217;t obvious extension points, you will simply know the concrete type you need, and can create it at a relatively high level and inject it down as an interface to the lower levels.  If, one day, you find that you need to externalize that dependency, it&amp;#8217;ll be easy because you&amp;#8217;ve already inverted and injected it.&lt;/p&gt;</description>
      <pubDate>Sun, 17 Jan 2010 12:42:00 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:00f97566-88ff-41a0-a0b1-4baee8225dc0</guid>
      <author>Uncle Bob</author>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion</link>
      <category>Uncle Bob's Blatherings</category>
      <category>Design Principles</category>
      <category>Clean Code</category>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by trampolines for sale</title>
      <description>&lt;p&gt;I just got home from a gathering and I thought that I&amp;#8217;d surf the web for some time before I&amp;#8217;d hit the sack. As I saw your posting, I was quite interested to find out more and I thought I would learn about it even further. I am most generally keen on trampolines for sale but your content has also fascinated me. Thank you for posting and thanks for allowing me post here.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 20:38:37 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1b7ae6a4-28a3-4afe-be0d-d53b17687c11</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202150</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by cisco training</title>
      <description>&lt;p&gt;It&#8217;s my day off from my job and I figured I&#8217;d stay at home for a change. I was just searching through a few sites that fascinate me and I came upon this blog. The Cisco training webpage that I also discovered was absolutely enjoyable. I had a blast reviewing their blog posts and reviews. Anyhow, I think that this webpage here is merely impressive. Thanks for letting me hang around on this site. I will look forward to coming back when I have yet another time off at home.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 19:32:11 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:8da8c7a8-933e-43c4-9e39-340e17e36b54</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202140</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by frasi celebri</title>
      <description>&lt;p&gt;Your articles is great, thanks&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 13:42:13 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:b9ea02f9-53c7-47d3-8047-33ec32358966</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202132</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Get Air Conditioner</title>
      <description>&lt;p&gt;Also notice that I rolled my own Test Doubles (we used to call them mocks, but we&#8217;re not allowed to anymore.) It would have been tragic to use a mocking framework for such a simple set of &lt;a &gt;tests&lt;/a rel="nofollow"&gt;.&lt;/p&gt;


	&lt;p&gt;Most of the time the best kind of Dependency Injection to use, is the manual kind. Externalized dependency injection of the kind that Guice provides is appropriate for those classes that you know will be extension points for your system.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 08:03:38 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:54bfbe6a-e538-4834-b3c5-6b4dbf8ac15f</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202120</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by iphone 4S jailbreak</title>
      <description>&lt;p&gt;I would really say that after the jailbreak of iPhone 4S there are many t hings that have been changed.&lt;/p&gt;


	&lt;p&gt;&lt;a &gt;iphone 4S jailbreak&lt;/a rel="nofollow"&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 06:13:40 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ba13151a-d11f-47dd-a6bf-9c227d6a0df9</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202109</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by pest control reading</title>
      <description>&lt;p&gt;I love this site. This is a very good site and good post too.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 05:05:04 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ef4fa885-d9da-494e-8018-f4addc26d43c</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202103</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by learnh2h@gmail.com</title>
      <description>&lt;p&gt;Thanks for sharing experience.it should be really a great post.
&lt;a href="http://www.learn-how-to-hack.com/" rel="nofollow"&gt;learn how to hack&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 02:35:52 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:502ccc11-7acd-4b2e-8452-893873d4e971</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202049</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by learnh2h@gmail.com</title>
      <description>&lt;p&gt;Thanks for sharing experience.it should be really a great post.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.learn-how-to-hack.com/" rel="nofollow"&gt;learn how to hack&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 07 Feb 2012 01:57:21 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c5249402-b59f-4d35-9fdb-eea03237d44d</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-202044</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by vitra furniture</title>
      <description>&lt;p&gt;I&amp;#8217;m not really normally inspired by informative material, but your topic honestly made me give thought to your viewpoints. You have absolutely presented beneficial and sound thoughts that are logical and exciting. I privately care to talk about vitra furniture. Therefore I am conscious of the effort it will require to create an educational post like this. Thank you so much for featuring your positive work.&lt;/p&gt;</description>
      <pubDate>Mon, 06 Feb 2012 19:35:31 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:9ab6f055-6b6b-495c-a4bd-11718a849901</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-201978</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by nice</title>
      <description>&lt;p&gt;&lt;a href="http://nimls.edu.pk" rel="nofollow"&gt;nice&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 05 Feb 2012 12:37:44 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e2232190-a6ab-4408-841c-db3cf60612b2</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-201837</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by carbon monoxide detector</title>
      <description>&lt;p&gt;I recently read some articles that were so dull and off center that I couldn&#8217;t abide finishing them. Your article is not one of those articles. I like your content.&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 01:21:08 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c27c7b99-2de3-40c8-a88b-6f635194cf9d</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-201419</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by &lt;a href="http://www.andrew-reynolds.com"&gt;Andrew Reynolds&lt;/a&gt;</title>
      <description>&lt;p&gt;I am not normally stimulated by informative material, though&lt;/p&gt;


	&lt;p&gt;your post truly made me gives some thought to your viewpoints.&lt;/p&gt;


	&lt;p&gt;You have unquestionably offered important and reliable&lt;/p&gt;


	&lt;p&gt;thoughts that are logical and appealing. I privately love to&lt;/p&gt;


	&lt;p&gt;comment on Andrew Reynolds. So I know the hard work it&lt;/p&gt;


	&lt;p&gt;requires to make an informative article like this. Thanks a&lt;/p&gt;


	&lt;p&gt;lot for spreading your fine work.&lt;/p&gt;</description>
      <pubDate>Thu, 02 Feb 2012 01:53:54 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:298b7834-33b6-4a2e-9f4c-a5be3e7bbea2</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-200697</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by half hitch</title>
      <description>&lt;p&gt;Just after discovering half hitch review, I chanced on your site. I didn&#8217;t assume that a plain site that it would seem would produce much fascinating and impressive content. Keep undertaking an excellent task. I&#8217;m guaranteed a lot of people would rely on you!&lt;/p&gt;</description>
      <pubDate>Wed, 01 Feb 2012 21:35:25 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:64eb6302-e069-4bd2-8104-73b7e554c879</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-200613</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Ady Blink</title>
      <description>&lt;p&gt;thanks, nice artikle&lt;/p&gt;</description>
      <pubDate>Tue, 31 Jan 2012 03:07:07 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:2c868435-2702-42b6-80d7-8582dea02201</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-200342</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by motor vehicle dealer</title>
      <description>&lt;p&gt;I do not know what to say. This web page is awesome. That not really a really big review, but its all I could come up with after examining this. You know so much about this subject. So much so that you developed me want to find it. Your web page website is my stepping-stone, my companion. Thanks for the mind up on this subject.&lt;/p&gt;</description>
      <pubDate>Mon, 30 Jan 2012 04:50:15 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1e535c2b-7605-4b87-8c5c-cd7f1fd2cd5c</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-200202</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Administrative Medical Assistant classes Southern California</title>
      <description>&lt;p&gt;These are some awesome details to use. We use this at operate all-time. Keep up the truly awesome. Thanks for all this. I like your operate..&lt;/p&gt;</description>
      <pubDate>Mon, 30 Jan 2012 04:48:46 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:ee6cdfa3-9cfa-42f2-8540-8b00d4d0aecd</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-200201</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Pass</title>
      <description>&lt;p&gt;very good information. this code is realy for professionals.&lt;/p&gt;</description>
      <pubDate>Sat, 28 Jan 2012 09:15:09 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:6c4bf0bc-33b4-4352-99ef-91a2ee5b437e</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-199698</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Pass</title>
      <description>&lt;p&gt;Nice post. I have idea.&lt;/p&gt;</description>
      <pubDate>Sat, 28 Jan 2012 09:12:07 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:efc83244-44e8-43bb-b029-40d835c7f784</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-199697</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by Anglu kalbos kursai Vilniuje</title>
      <description>&lt;p&gt;Nice post. Interesting, informative. Keep going. It would be greate to read more on this topic!&lt;/p&gt;</description>
      <pubDate>Mon, 23 Jan 2012 10:43:03 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:369acbe3-41a0-4a33-94fc-45548e5539d4</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198929</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by www.mokslosodas.lt</title>
      <description>&lt;p&gt;Nice post. Interesting, informative. Keep going. It would be greate to read more on this topic!&lt;/p&gt;</description>
      <pubDate>Mon, 23 Jan 2012 10:42:30 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:7c9421be-011b-4a4c-b9ea-4a38b5a0e665</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198928</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by wholesale dealers license</title>
      <description>&lt;p&gt;very nice to see your blog here i like it and would like to appreciate you on this so keep it up man for more details&lt;/p&gt;</description>
      <pubDate>Mon, 23 Jan 2012 03:52:44 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:d03cbbde-b35f-4a3b-9fa0-fe3c2d9dd1ed</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198844</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by free cell phone spy</title>
      <description>&lt;p&gt;Thanks for the awesome article here. I am a huge fan of design so it is really interesting for me to read such stuff. I just hope to see more such nice articles.!&lt;/p&gt;</description>
      <pubDate>Mon, 23 Jan 2012 01:47:16 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:c8109614-32f8-45a4-98e1-a2863c71a89d</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198832</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by tramadol </title>
      <description>&lt;p&gt;great post i would like you to guess post on my site
&lt;a href="http://www.tramadol.usaonline.biz" rel="nofollow"&gt;http://www.tramadol.usaonline.biz&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 22 Jan 2012 03:27:49 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:27cb8249-41c5-4104-9548-28023d1a2ae4</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198797</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by AP English literature</title>
      <description>&lt;p&gt;Really very good information web page. I have to admit that we&#8217;re definitely warm the idea&lt;/p&gt;</description>
      <pubDate>Thu, 19 Jan 2012 05:55:08 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:1790ad19-1144-4834-85b9-788ad7d6b696</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198586</link>
    </item>
    <item>
      <title>"Dependency Injection Inversion" by quotes about life and love</title>
      <description>&lt;p&gt;XML is so terrible I can&amp;#8217;t believe anyone would use it.&lt;/p&gt;</description>
      <pubDate>Tue, 17 Jan 2012 10:45:44 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:f7ccdf3f-cc64-46af-8265-8fae93c32ad1</guid>
      <link>http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion#comment-198367</link>
    </item>
  </channel>
</rss>

