views:

8038

answers:

14

Which C#/.NET Dependency Injection frameworks are worth looking into? And what can you say about their complexity and speed.

+4  A: 

Ninject is great. It seems really fast, but I haven't done any comparisons. I know Nate, the author, did some comparisons between Ninject and other DI frameworks and is looking for more ways to improve the speed of Ninject.

I've heard lots of people I respect say good things about StructureMap and CastleWindsor. Those, in my mind, are the big three to look at right now.

ScottKoon
+1  A: 

I've used Spring.NET in the past and had great success with it. I never noticed any substantial overhead with it, though the project we used it on was fairly heavy on its own. It only took a little time reading through the documentation to get it set up.

Jason Sparks
A: 

The great thing about C# is that it is following a path beaten by years of Java developers before it. So, my advice, generally speaking when looking for tools of this nature, is to look for the solid Java answer and see if there exists a .NET adaptation yet.

So when it comes to DI (and there are so many options out there, this really is a matter of taste) is Spring.NET. Additionally, it's always wise to research the people behind projects. I have no issue suggesting SourceGear products for source control (outside of using them) because I have respect for Eric Sink. I have seen Mark Pollack speak and what can I say, the guy just gets it.

In the end, there are a lot of DI frameworks and your best bet is to do some sample projects with a few of them and make an educated choice.

Good luck!

Ian Patrick Hughes
+10  A: 

Speaking as someone who has written one, don't use mine. :)

+1 vote for evaluating Ninject, StructureMap, and Windsor.

Brad Wilson
Brad, which one would that be?
mxmissile
Unity I believe.
Jason Young
ObjectBuilder, actually. The underpinnings of Unity.
Brad Wilson
Is your comment regarding unity (or ObjectBuilder) still valid, or would you revise it?
M4N
+72  A: 

I suppose I might be being a bit picky here but it's important to note DI (Dependency Injection) is a programming pattern and is facilitated by (but does not require) an IoC (Inversion of Control) Framework. IoC Frameworks just make DI much easier, but it's not only DI that they do, they provide a host of other benefits over and above DI.

That being said, I'm sure that's what you were asking: about IoC Frameworks: I used to use Spring.Net and CastleWindsor a lot, but the real pain in the beehiind was all that pesky XML config you had to write! They're pretty much all moving this way now, but I started using StructureMap for the last year or so, and since it has moved to a fluent config using strongly typed generics and a registry, my pain barrier in using IoC has dropped below zero! I get an absolute kick out of knowing now that my IoC config is checked at compile-time (for the most part) and I have had nothing but joy with StructureMap and its speed. I won't say that the others were slow (runtime), but they were more difficult for me to setup and frustration often won the day.

I believe they're all moving towards a more strongly typed config now - or at least providing the option, but some people love putting all the config in XML - personally I can't bare it, so I have stuck to StructureMap now.

I can't comment much on Ninject except that I listened to Nate on one of the Herding Code podcasts and he's one switched-on guy, and the screencasts I've watched have really tempted me to try it out - maybe on the next project - who knows.

Update: In a follow up to my comments here, I've been using Ninject (as promised) on my latest project and it has been an absolute pleasure to use. Words fail me a bit here, but (as we say in the UK) this framework is the Dogs'. I highly recommend it for any green fields projects where you want to be up and running quickly. I got all I needed from a fantastic set of Ninject screencasts by Justin Etheredge. I also can't see that retro-fitting Ninject into existing (above average) code being a problem at all - but then the same could be said of StructureMap in my experience. It'll be a tough choice going forward between those two, but I'd rather have competition than stagnation and there's a decent amount of healthy competition out there.

Other IoC screencasts can also be found here on Dimecasts.

Hope that helps,

Rob G

RobertTheGrey
It's great to see a quality, well thought out answer rise about the one liners. You convinced me to check out StructureMap.
Chris Marasti-Georg
Excellent answer with good references, I like it!
Dave Van den Eynde
The dog's what? ;)
Benjol
Nice but to be fair - Windsor has a very nice fully-fledged fluent interface now as well.
Krzysztof Koźmic
+3  A: 

I haven't used any other DI frameworks besides Unity from the Microsoft Patterns & Practices group, but I was pretty surprised at how lightweight it seems. There's a great screencast that outlines the common usages and had me up to speed in under 30 minutes.

Shawn Miller
+17  A: 

Autofac. http://code.google.com/p/autofac/ It is really fast and pretty good. Here is a link with comparisons (made after Ninject fixed a memory leak issue).

http://www.codinginstinct.com/2008/05/ioc-container-benchmark-rerevisted.html

Pete
Autofac is the first DI container I've really tried out, and thus far it's been brilliant. Simple, quick, and powerful
Orion Edwards
+1 for Autofac. I love it.
Troy
A: 

I think a good place to start is with Ninject, it is new and has taken into account alot of fine tuning and is really fast. Nate, the developer, really has a great site and great support.

Rob Bazinet
A: 

I can recommend Ninject. It's incredibly fast and easy to use but only if you don't need XML configuration, else you should use Windsor.

Julio César
+4  A: 

I'm a huge fan of Castle. I love the facilities it also provides beyond the IoC Container story. It really simplfies using NHibernate, logging, AOP, etc. I also use Binsor for configuration with Boo and have really fallen in love with Boo as a language because of it.

Chris Canal
A: 

Spring.Net is quite solid, but the documentation took some time to wade through. Autofac is good, and while .Net 2.0 is supported, you need VS 2008 to compile it, or else use the command line to build your app.

David Robbins
+15  A: 

It depends on what you are looking for, as they each have their pros and cons.

  1. Spring.NET is the most mature as it comes out of Spring from the java world. Spring has a very rich set of framework libraries that extend it to support Web, Windows, etc.
  2. Castle Windsor is one of the most widely used in the .NET platform and has the largest ecosytem, is highly configurable / extensible, has custom lifetime managemenet, AOP support, has inherent NHibernate support and is an all around awesome container. Windsor is part of an entire stack which includes Monorail, Active Record, etc. NHibernate itself builds on top of Windsor.
  3. Structure Map has very rich and fine grained configuration through an internal DSL.
  4. Autofac is an IoC container of the new age wtih all of it's inherent functional programming support. It also takes a different apporach on managing lifetime than the others. Autofac is still very new, but it pushes the bar on what is possible with IoC.
  5. Ninject I have heard is more bare bones with a less is more approach (heard not experienced).
  6. The biggest discriminator of Unity is it's from and supported by Microsoft (p&p). Unity has very good performance, and great documentation. It is also highly configurable. It doesn't have all the bells and whistles of say Castle / Structure Map.

So in summary, it really depends on what is important to you. I would agree with others on going and evaluating and seeing which one fits. The nice thing is you have a nice selection of donuts rather than just having to have a jelly one. :-)

Glenn Block
Good description. I would stay away from Unity though as it's simply a PITA to use.
Krzysztof Koźmic
Autofac is actually not so new, it is older than Unity :)
Nicholas Blumhardt
Did I say it was newer than Unity? I said it is of the new age...ie I meant it's functional nature. OK, what I said it's still very new, what I meant though was it's nature not that IT was new. :-)
Glenn Block
+1  A: 

We use Unity from the Microsoft Enterprise Library

NotDan
+2  A: 

I use the Simple Service Locator.

"The Simple Service Locator is an easy-to-use Dependency Injection library that is a complete implementation of the Common Service Locator interface. It solely supports code-based configuration and is an ideal starting point for developers unfamiliar with larger DI libraries."

http://simpleservicelocator.codeplex.com/

Steven