Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Usage of IoC Containers; specifically Windsor

I think the answer to this question is so obivous that noone has bothered writing about this, but its late and I really can't get my head around this.

I've been reading into IoC containers (Windsor in this case) and I'm missing how you talk to the container from the various parts of your code.

I get DI, I've been doing poor mans DI (empty constructors calling overloaded injection constructors with default parameter implementations) for some time and I can completely see the benefit of the container. However, Im missing one vital piece of info; how are you supposed to reference the container every time you need a service from it?

Do I create a single global insance which I pass around? Surely not!

I know I should call this:

WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 

(for example) when I want to load my XML config, but then what do I do with container? Does creating a new container every time thereafter persist the loaded config through some internal static majicks or otherwise, or do I have to reload the config every time (i guess not, or lifecycles couldnt work).

Failing to understand this is preventing me from working out how the lifecycles work, and getting on with using some IoC awsomeness

Thanks,

Andrew

like image 873
Andrew Bullock Avatar asked Dec 14 '08 23:12

Andrew Bullock


People also ask

What is Windsor container?

Castle Windsor is a best of breed, mature Inversion of Control container available for . NET and Silverlight. The current version is 5.0, released in February 2019. Refer to the links on the right to download it from GitHub or NuGet.

Do I need an IoC container?

The people who understand IoC containers have trouble believing that there are people who don't understand it. The most valuable benefit of using an IoC container is that you can have a configuration switch in one place which lets you change between, say, test mode and production mode.

What is Castle Windsor dependency injection?

Castle Windsor is Dependency Injection container. It means with the help of this you can inject your dependencies and use them without creating them with the help of new keyword.


1 Answers

99% of the cases it's one container instance per app. Normally you initialize it in Application_Start (for a web app), like this.

After that, it's really up to the consumer of the container. For example, some frameworks, like Monorail and ASP.NET MVC allow you to intercept the creation of the instances (the controllers in this case), so you just register the controllers and their dependencies in the container and that's it, whenever you get a request the container takes care of injecting each controller with its dependencies. See for example this ASP.NET MVC controller. In these frameworks, you hardly ever need to call or even reference the container in your classes, which is the recommended usage.

Other frameworks don't let you get in the creation process easily (like Webforms) so you have to resort to hacks like this one, or pull the required dependencies (that is, explicitly calling the container). To pull dependencies, use a static gateway to the container like this one or the one described by maxnk. Note that by doing this, you're actually using the container as a Service Locator, which doesn't decouple things as well as inversion of control. (see difference here and here)

Hope this clears your doubts.

like image 149
Mauricio Scheffer Avatar answered Oct 04 '22 15:10

Mauricio Scheffer