DI Containers – comparison

By eidias on (tags: IoC, categories: None)

This blog shortly describes a few chosen DI containers and their out-of-the-box functionality. If a certain container does not have a specific platform listed, it doesn’t necessarily mean that it’s not possible to use it there – it just means that it’s not in the box.

Castle Windsor

License: Apache 2
Target platforms: .Net, Silverlight
Complexity: Castle.Core, Castle.Windsor + facilities (plugins)
Acceptance: 3500 downloads nuget, 8600 downloads site
Age: ver 2.0 in 2009
Last Release: 02.2011
Features:

  • configurable in xml
  • autodiscovery
  • well documented

Sample code:

   1: var container = new WindsorContainer();
   2: container.Install(FromAssembly.This());
   3: var king = container.Resolve<IKing>();
   4: king.RuleTheCastle();
   5: container.Dispose();

StructureMap

License: Apache 2
Target platforms: .Net
Complexity: StructureMap, StructureMap.AutoMocking (for unit tests)
Acceptance: 3500 downloads nuget, 10 000+ downloads site
Age: since 2004
Last Release: 02.2010
Features:

  • configurable in xml
  • autodiscovery (extensive)

Sample code:

   1: ObjectFactory.Initialize(x =>
   2:                              {
   3:                                  x.ForRequestedType<IValidator>()
   4:                                  TheDefaultIsConcreteType<Validator>();
   5:                              });
   6: IValidator validator = ObjectFactory.GetInstance<IValidator>();

Spring.Net

License: Apache 2
Target platforms: .Net, MVC, WCF,
Complexity: Spring.Core.Configuration
Acceptance: 60 downloads nuget
Age: since 2007
Last Release: 12.2010
Features:

  • configurable in xml

Sample code:

   1: [Configuration]
   2: public class ControllerConfiguration
   3: {
   4:     [Definition]
   5:     [Scope(ObjectScope.Prototype)]
   6:     public virtual HomeController HomeController()
   7:     {
   8:         HomeController controller = new HomeController();
   9:         controller.Message = "MVC powered by Spring.NET!";
  10:         return controller;
  11:     }
  12: }

Autofac

License: MIT
Target platforms: .Net, MEF, MVC, WCF, WEB, Community, Silverlight
Complexity: Autofac, Autofac.Configuration + (MEF, MVC, WCF, WEB and community Prism, WCF Ria Services, Log4Net)
Acceptance:  3000 downloads nuget, 800+ downloads site
Age:
Last Release: 03.2011
Features:

  • confugurable in xml
  • autodiscovery

Sample code:

   1: var builder = new ContainerBuilder();
   2: builder.RegisterAssemblyTypes(controllerAssembly);
   3: var container = builder.Build();
   4: var taskController = container.Resolve<TaskController>();
 

Unity

License: MS-PL
Target platforms: .Net, Silverlight
Complexity: Microsoft.Practices.ServiceLocation, Microsoft.Practices.Unity, Microsoft.Practices.Unity.Configuration, Microsoft.Practices.Unity.Interception, Microsoft.Practices.Unity.Interception.Configuration
Acceptance: 4000 downloads nuget, 50 000+ downloads site
Age: since 2005
Last Release: 05.2010 (seems out of data – projects fo vs 2008)
Features:

  • configurable in xml
  • autodiscovery

Sample code:

   1: IUnityContainer container = new UnityContainer()
   2:     .RegisterType<ILogger, TraceLogger>()
   3:     .RegisterType<IStoplightTimer, RealTimeTimer>();
   4: var form = container.Resolve<StoplightForm>();