Monday, October 08, 2007

Windsor Container Resources

Here a few Windsor Container resources that I've stumbled across recently. I'm planning to maintain this list as a reference for my potential presentation at DDD6.

Jeremy Jarrell of Digital Blasphemy does a good overview in his 'Windsor IoC Container in a Lunch Break'. The comments are worth reading too.

Alex Henderson aka Bitter Coder has a great tutorial in his Wiki.

Oren Eini has a very cool article showing the power of Windsor when working with generic interfaces on MSDN: Inversion of Control and Dependency Injection: Working with Windsor Container.

Thursday, October 04, 2007

My Developer Developer Developer Day session

I've just offered to present a session on Inversion of Control containers at the Developer Developer Developer Day at the Microsoft campus on the 24th November. It's titled 'Why do I need an Inversion of Control Container?' and I intend to present an expanded version of my recent post about the Castle Project's Windsor Container. I think there's enough material to easily fill an hour, especially if I do a hands-on coding session.

Although I'm an ex English teacher, spending two years on the JET program, and I've done plenty of presentations and workshops for my clients, this will be the first time I've presented at a developer event like this. It should be a lot of fun, I just hope my session gets enough votes to be put forward. So if you're reading this and thinking, "I'd really like to see Mike humiliate himself in front of a technical audience', don't fail to vote for me when registration opens for DDD :)

Tuesday, October 02, 2007

Ben on MonoRail

As you'd probably know from reading any of my recent posts, I've become very curious about the Castle Project recently. One of the it's elements is the MonoRail Rails-a-like web development toolkit that sits on top of ASP.NET. 'Ben' (I couldn't find his full name on his blog anywhere) provides a great critique of WebForms here and the pros and cons of MonoRail here. I recently ran through the getting started guide for MonoRail and it has really intrigued me, especially the separation of concerns that an MVC framework provides that allows you to finally be able to test your web application logic properly.

Why are you still hand coding your data access layer?

At last it seems that the dreaded DataSet is dead. There are many reasons why you should always think twice before choosing the DataSet as the core of your application architecture, I covered most of them a couple of years ago here. In my freelancing work I've found that none of my recent clients have used DataSets, preferring instead some kind of Domain Model or Active Record data access mechanism, with Active Record becoming by far the favorite. It's also worth noting that the terminology in most Microsoft shops calls the Active Record class a 'business object' or 'data object', almost nobody says 'Active Record'.

A core part of an Active Record based architecture is some kind of Data Access Layer that does Object Relational Mapping (ORM). Everyone writes their own one of these, and that's the main point of this post; you shouldn't need to do this. If you are like the majority of my clients, your application features thousands of lovingly hand crafted lines of code like this:

DataAccessLayer

These hand written data access layers are the commonest source of bugs in most business applications. There are several reasons for this, the most obvious being that there are hand coded string literals representing stored procedure names, stored procedure parameter names and column names. People do use an  enumeration instead of the string literal column names, mainly for performance reasons, but it doesn't stop the enumeration and the stored proc select statement's columns getting out of sync. There's also the overhead of matching up the SQL Server types to .net types and dealing with null values.  But the worst offense of all is the tedium and the waste of time. Writing and maintaining these Data Access Layers is the programmer's equivalent of Dante's inner ring of hell, and you don't have to do it.

If you're like me, you resent any kind of repetitive coding that the computer could do just as easily, but much much faster and more accurately. At some time in your career you've probably written a little program that queries the database schema and generates your Active Record classes and Data Access Layer. Yes, I've done this twice, once back in the days of Visual Basic client server systems and more recently for .NET. The second attempt got quite sophisticated, handling object graphs and change tracking, but I never really got it to the stage of a real Data Access Framework, one that could look after all my persistence needs. I used it to generate the bulk of the code and then hand coded the tricky bits, such as complex queries and relationships. I'm not the only one who's been  down this road, a whole army of very clever people, cleverer than you or me, have devoted large amounts of time to this problem, which is great because it means that you and me don't have to bother any more. These tools are now robust and mature enough that it's more risky to do it yourself than use one of them.

But how  do you choose which one to use? There are two basic approaches, code generators and runtime ORM engines. Code generators, like mine, are the easiest to create, so there are more of them out there. Runtime ORM engines are a much trickier engineering problem but they will probably win in the end because they're easier to use for the end developer. Amongst the code generators, the ones I hear of the most are various Code Smith templates like net tiers, LLBLgen by Frans Bouma who's also a very active participant in community discussions around ORM, Subsonic which is attempting to be a Rails for .net, and Microsoft's very own Guidance Automation Toolkits. All are well regarded and you probably wouldn't go too far wrong with choosing any of them.

Among the runtime ORM engines, I hear NHibernate mentioned more than anything else. Hibernate is huge in the Java world so the NHibernate port has plenty of real world experience to fall back on. It's been used in a number of large scale projects and is the core of the Castle project's ActiveRecord rails-a-like data access solution. I haven't used it in anger, but my few experiments with it have been quite fun.

I haven't mentioned the elephant in the room yet, that's LINQ to SQL coming with .net 3.5. Microsoft have taken a long time to join the ORM party. A couple of years ago there was much talk of ObjectSpaces a Hibernate style ORM tool that never saw the light of  day. LINQ is a very elegant attempt to integrate declarative query style syntax into imperative .net languages like C#. LINQ to SQL makes good use of it, especially, as you'd expect, with its query syntax. In other ways LINQ to SQL is very much a traditional ORM mapper along the lines of Hibernate, it features some code generation tools to create your Active Record objects, a runtime ORM mapper that creates SQL on the fly, identity management and lazy loading; all the features you'd expect. If you're starting a new project and you're prepared to risk using the beta of Visual Studio 2008 then I would choose LINQ to SQL in favor of any of the other alternatives, not least because it's what everyone will be using in a couple of years time.

Monday, September 24, 2007

The joys of System.Diagnostics.StackFrame

I see code like this an awful lot where a logging function or whatever is passed a string literal of the current method name:
public void TheOldMethodUnderTest()
{
    Log("TheOldMethodUnderTest");
}

private void Log(string methodName)
{
    Console.WriteLine("The name of the method was: {0}", methodName);
}
I've also seen a lot of code like this where the actual method name and the string literal have become out of sync, either because of refactoring, or more commonly, the cut-and-paste method of code reuse. Fortunately there's a really easy way of getting the current stack trace from the System.Diagnostics.StackFrame class. The code below does exactly the same thing as the code above, but the Log() function works out for itself what its caller's name is:
public void TheMethodUnderTest()
{
    Log();
}

private void Log()
{
    System.Diagnostics.StackFrame stackFrame = new System.Diagnostics.StackFrame(1, false);
    System.Reflection.MethodBase method = stackFrame.GetMethod();
    Console.WriteLine("The name of the method was: {0}", method.Name);
}
Doing this kind of thing is a legitimate requirment in many applications, but if you find yourself having to put a lot of boiler-plate code in every method because of cross cutting concerns such as logging, it's worth looking at some kind of AOP framework that provides dynamic proxies that you can intercept.

Thursday, September 13, 2007

MIX 07 UK

ScottGu

I had a great time in London over the last couple of days at MIX 07 UK. Most of the excitement was about Silverlight, but there was also a lot of coverage of VS2008. I've been reading a lot about Silverlight recently, but this was the first time I'd seen a good demonstration of it in use. It's obviously Microsoft's Flash killer and it fills a big gap in RIA application development where you'd currently have to use Flash. For .net developers like me it opens up some great opportunities, so it can only be good. I guess its success will primarily hinge on how well Microsoft drives adoption. Scott Guthrie explained that they only have to persuade about 15 of the top sites to use it and it will become ubiquitous. One thing that really struck me, that I hadn't properly grepped before was how core XAML is to the current MS development stack. I really liked the way you could use the Expression * tools to move XAML projects between designers and developers. Those tools (especially Blend) are yet another thing I need to play with.

I went to the second of the VS2008 sessions, but it was pretty much covering stuff I already knew, although it was nice to see all the LINQ to SQL stuff presented. One thing that was new was the Rails style scaffolding stuff. I don't remember what it was called, but MS have blatantly got their eyes on the Ruby camp. Only for the best I think.

I was also really looking forward to the 'Why IronRuby', and 'IronPython et al' sessions. Dynamic languages are generating some real excitement these days and was very keen to get some insight into how Microsoft sees them playing with .net. 'Why IronRuby' by Dave Verwer was a bit of a disappointment, not because Dave didn't do an excellent job introducing Ruby, but I was rather hoping for a more philosophical discussion about dynamic languages in the .net world and how well they play with the existing MS technology stack. I had to leave before the questions, so maybe there was some interesting discussions? I hoped to grab Dave for a chat later on, but I couldn't track him down. Michael Foord's (aka Fuzzyman) IronPython session was much more what I wanted. Michael spent a lot of time digging into the intricacies of building dynamic languages on top of the CLR, the DLR and some of the cool stuff you could do with IronPython and Silverlight. I'm kinda seeing what the Python and Ruby people are saying about the benefits of dynamism, but I'm still not quite ready to really embrace it yet. The opportunity will  come when the IronRuby implementation has been fully developed in a year or so, but I must stay, the DSL story from the Ruby camp is very compelling.

My favorite session was the 'A nice cup of tea and a sit down', a panel discussion with Scott Guthrie. As you probably know, Scott is the general manager of the .net development group and his blog is always my first stop to keep up with what's happening at MS. It's not everyday that you get to fire some questions at one of the core .net guys, so I really enjoyed myself.

I asked Scott about TDD at Microsoft and how they saw TDD fitting in with their products. I was especially keen to hear what he thought about the problems with mocking the BCL.

He told us about a new MVC framework that's in the pipeline for ASP.NET that sounded very intriguing and how they were consciously trying to keep it interoperable with open source tools. I was especially gratified to hear him mention Windsor and RhinoMocks.

It's a shame there wasn't more time, I really wanted to ask him about functional programming and LINQ and how explicitly MS are going to encourage more declarative programming styles in the BCL and documentation. Right now the message seems to be that LINQ is query and the functional declarative stuff is only mentioned if you're prepared to dig deep.

Saturday, September 01, 2007

Microsoft and Innovation

I love reading Scott Hanselman's blog. I missed a great post back in May, 'Is Microsoft losing the Alpha Geeks?' In it he talks about his recent visit to RailsConf where he was very impressed by the energy of the Ruby-on-Rails (RoR) community. Unless you've been avoiding the blogosphere for the last couple of years, you'll know all about the incredible buzz around RoR. It's certainly taking a lot of the most respected people in the development community along with it, not least of all Martin Fowler and his company Thoughtworks. So Scott asks if Microsoft has lost it's way; is it 'losing the Alpha Geeks?' So what's an Alpha Geek? Let's assume for the sake of argument we're talking about the guys who actually move the industry forward, not just the people who really have a deep understanding of the technology, but the people who invent it. I don't think Microsoft are loosing them, because I don't think they ever had them in the first place. Let's step back and think about innovation for a while. How does technology, or even in the broader sense, culture, change and advance? What kind of conditions promote innovation and which stifle it? The great thinker in this field was the economist Joseph Schumpeter, he coined the phrase 'creative destruction', to describe the driving force of innovation in a capitalist economy. Essentially the rate of innovation is proportional to the number of people able to innovate; the number of minds allowed to tackle a particular question and the ability of individuals or groups to attempt to profit from their idea without a severe cost of failure. Capitalism thrives on huge numbers of small companies and entrepreneurs constantly trying and failing. A Darwinian survival of the fittest where the vast majority do not succeed. Indeed it goes beyond capitalism, Jarred Diamond's seminal work 'Guns, Germs and Steel', brilliantly shows how human development progressed in direct proportion to the size of human communities and the speed at which technological developments could be propagated. When you get bored of 'learn WPF in 21 days' it's must read! The software industry is a pure manifestation of Schumpeterian economics. The barriers to entry are almost non-existant; anyone with an idea can have a go. It doesn't really make a lot of difference if you're a highly paid Microsoft employee or a Gujarati teenager with a computer, the quality of your ideas is the only thing that matters. In fact there are two good reasons why the Gujarati teenager has an advantage: Firstly he doesn't have to persuade his line manager that his idea is a good one before he's allowed to explore it; he can have a go at any hair brained wackiness he likes. His idea doesn't have to play nicely with any particular corporate strategy or favorite technology. Secondly, and conversely, he has to persuade the whole world that his idea is a good one. The Microsoft guy, once he's persuaded the company, will have the whole weight of Microsoft's marketing behind him and millions of Microsoft shops around the world will use his technology even if it's sub-optimal. But because the Gujarati teenager has none of this support his idea will only thrive if it's a really really good one. So Microsoft's 1000's of highly paid geeks verses who knows how many millions of the rest of the world's programmers? It's no competition, the cutting edge will always be outside of Microsoft or any other corporation for that matter. I think Microsoft collectively knows this and the company has become a lot more responsive to good ideas coming out of the world wide software community. The new openness of public betas and shared source initiatives are evidence of this. Microsoft has also become much better at picking the best talents from the community, just take the example of John Lam. So what does this mean for the average Microsoft Mort like you and me? Well, if you're interested in the state of the art and you want to see what the software world might look like in the next five or ten years, then you've really got to raise your eyes from the MSDN front page. You'll almost never see anything truly innovative there. And even when you do see something new there, there's no guarantee at all that it's a good idea. It hasn't been filtered by the community yet. When Microsoft has adopted something, it's not the cutting edge any more it's the mainstream. Take an interest in what's happening in the rest of the software world and occasionally try out something that's nothing to do with Redmond. Ruby on Rails obviously has something good going for it or there wouldn't be a whole lot of very clever people banging on about it all the time. Now this doesn't mean that you or I should suddenly abandon Visual Studio and everything we know for a Linux box, Emacs and a command line, but it does mean that it's worth keeping an eye on similar things that might be evolving in the .net ecosystem, like Subsonic or Monorail. And don't assume that ASP.NET is the only and best web development framework. I hope this doesn't sound like I'm Microsoft bashing, indeed my whole career (and it's been a relatively prosperous and happy one so far) is built around Microsoft. I'm very happy with the Borg's new found openness and these days there's such a flourishing open source community around the Microsoft tools, especially .net, that you don't have to wait for corporate adoption before being able to integrate the best modern development techniques into your work.

Thursday, August 30, 2007

Testing Will Challenge Your Conventions

I've just stumbled upon a fantastic blog post Testing Will Challenge Your Conventions, by Tim Ottinger. In it he lists a number of ways that doing TDD fundamentally changes the way you code:
  1. Interfaces suddenly seem like a good idea.
  2. You stop using singletons and static methods.
  3. Private makes less sense than it used to.
  4. You pass dependencies in the constructor (the so called 'fat constructor')
  5. Smaller methods are the norm.
  6. You read tests before the code; it better explains the intention.
  7. Usability trumps cleverness.
  8. Premature performance optimisation is bad (YAGNI)...
  9. ... but test performance is crucial.
  10. Dependency is bad; you avoid 'God classes' and 'global hubs'.
  11. 'Clever' is dead. 'Clever' is hard to refactor. 'Clever' is hard to isolate, hard to internalize, hard to phrase in tests.
  12. Your IDE is only good if it allows you to do quick write/build/test cycles.
As he says, all this stuff is good practice, but the genius of TDD is that it drives you to do it. It gives you your first excuse to write component oriented, highly cohesive, loosely coupled code. Without it, these good practices just seem like academic hot air, right up to the point that you discover your application is spaghetti. As I blogged recently, I've had an epiphany where, in my mind, two distinct concerns, TDD and component oriented architectures have merged. Although I've been interested in component architectures for a while they've always seemed to be quite heavyweight beasts, and to be honest, I've never used them for application development. In the case of the MS IComponent framework that was the right call, the benefits would have been outweighed by ugliness of the framework. But with a lightweight, non-intrusive, component framework like Castle Windsor it makes perfect sense. What's interesting though is that it's just another example of how I've been lead to better programming techniques simply by doing TDD. What started as an easier way of writing test harnesses has had more impact on my development as a programmer than any other practice I've adopted.

Tuesday, August 07, 2007

Masters, Journeymen, and Apprentices

I've really enjoyed reading this series of blog posts by Fred George, Masters, Journeymen, and Apprentices. In it, he says what everyone knows, but few teams seem to accept: all programmers are not created equal. He divides programmers into Masters, Journeymen and Appentices. I must say, that reading his descriptions, even the lowest level on his scale, the Apprentice, is more skilled at OO development than most of the developers I encounter. He's another thoughtworker, a company that consistently seems to attract the best programmers, so it's not really surprising that there's such a high bar. The truth is that your average Microsoft programmer in your average company's development shop knows almost no OO at all. I don't consider myself a great programmer, I'm probably at his Journeyman level, but I'm consistently the only guy who's doing OO programming (as Fred George describes it) at the majority of my clients. I think it's really down to the fact that it's very hard to measure the ability of a programmer at programming and so it's ignored by management. There tends to be no concept of growing programming skills by mentoring or training. This is especially true of OO skills. I would say that being skilled at OO provides a step change in any programmers productivity, but this is rarely measured or encouraged. In fact OO programming practices are relatively uncommon in most Microsoft shops and are often dismissed as an academic waste of time. I was told by one 'architect' that we were doing OO programming because we were using C#, regardless of the fact that most of his procedures where hundreds of lines long and had a cyclic complexity of about a million:) Sure you can read lots of books on technologies and do lots of Microsoft exams, but that's about APIs and technology, the actual art itself is often totally neglected. And it is an art. With no way to measure ability most management simply measure seniority by length of service. What I often find is that the quality of the whole team is governed by the quality of the senior developer(s), the guy who does the recruitment interviews. If he's good then then he tends to be able to recognise good people and recruit them, if he's not so good then the team too tends to be poor. But even if he's good it's a struggle, you have to be prepared to turn away a lot of people with all the right qualifications and pay good money to get the few people out there who really know OO. That's a hard sell to management who far too often see developers as plug and play components. It's quite depressing really. I constantly hope that I'm going to get to work with a Master programmer because I know that's the only way I have any hope of ever attaining that level myself, but apart from the odd great team (only two I can actually think of in my career), it's a vain hope.

Monday, August 06, 2007

The Castle Project's Windsor Container and why I might need it.

I've recently had a bit of a eureka moment after reading about the Castle project. I've been hearing about Castle for a while now, but it's taken until now for me to grep what it's all about and why I need it. A quick look at the home page left me a little bemused. There's a thing called "MicroKernel" that's described as "A lightweight inversion of control container core". Now I know all about inversion of control, it's an essential ingredient to building scalable, testable applications, but what is an 'inversion of control container'? And why would I need one? Below "MicroKernel" is "Windsor Container". Nice, "Windsor Castle", get it? It's obviously aimed at the UK programming community. Windsor is described as "Augments the MicroKernel with features demanded by most enterprise projects", but I still don't see why I would need one. After seeing the Castle project mentioned for about the fifth time by bloggers who have far more brains and sense than me, I decided to knuckle down and RTFM by reading Introducing Castle by Hamilton Verissimo who's one of the main developers. Now let me take you on a little coding journey to show you how Castle, and more specifically Windsor, solves an problem that's become more and more apparent to me, mainly because I've adopted test driven development (TDD). I'm going to use a similar example to Hamilton's, but try and drive out the need for Windsor from a test driven perspective. OK, for my little example, say I've got a reporting class, 'SimpleReporter', that creates a report and then emails it. The code that uses it might look something like this:
SimpleReporter reporter = new SimpleReporter();
reporter.SendReport();
And the SendReport method might look like this:
public void SendReport()
{
  ReportBuilder builder = new ReportBuilder();
  Email email = builder.CreateReport();
  EmailSender sender = new EmailSender();
  sender.Send(email);
}
It creates uses a class called ReportBuilder to create an email report and then another class called EmailSender to send it. This is the kind of thing I used to write before I got into TDD. It works, but in order to test it I've got start up my application and use the UI to create and send a report. I then have to check my emails to see if the report has arrived. I'm not testing just my SimpleReporter class, I'm testing the SimpleReporter, the ReportBuilder and anything it relies on, the EmailSender, my SMTP server, my email client, my application's UI and probably a relational database and my data access layer. In short I'm testing a large chunk of my application and infrastructure. If something goes wrong I'm into a serious debugging session trying to work out why my Email hasn't arrived. I can't automate this test easily so I'm not going to do it very often and if a bug is introduced by a change to some other part of the system I'm not going to notice it immediately. Now I would use inversion of control and dependency injection with a mock object framework like NMock to just test my Reporter and nothing else. I blogged about NMock a while back. Here's the new Reporter class, note how I pass a report builder and emailSender in the contructor and how I'm only referencing interfaces not concrete classes.
public class Reporter
{
  IReportBuilder _reportBuilder;
  IEmailSender _emailSender;

  public Reporter(IReportBuilder reportBuilder, IEmailSender emailSender)
  {
      _reportBuilder = reportBuilder;
      _emailSender = emailSender;
  }

  public void SendReport()
  {
      Email email = _reportBuilder.CreateReport();
      _emailSender.Send(email);
  }
}
And here's its NUnit test.
[Test]
public void ReporterTest()
{
  string theText = "Hello, I'm the report!";

  Mockery mocks = new Mockery();
  IReportBuilder reportBuilder = mocks.NewMock();
  IEmailSender emailSender = mocks.NewMock();

  Email email = new Email(theText);

  Expect.Once.On(reportBuilder).Method("CreateReport").Will(Return.Value(email));
  Expect.Once.On(emailSender).Method("Send").With(email);

  Reporter reporter = new Reporter(reportBuilder, emailSender);
  reporter.SendReport();

  mocks.VerifyAllExpectationsHaveBeenMet();
}
NMock provides me with mock object instances to pass to the Reporter class' constructor. I don't even need to have writen concrete implementations of ReportBuilder or EmailSender at this stage. I can test that the Reporter class does the correct thing with reportBuilder and emailSender and I'm not testing anything else about the application at this stage. Most importantly this is an automated test that can be run in an instant along with every other automated test for my application. If I make a change that breaks Reporter I'll find out instantly. Discovering TDD has made me a much better and productive developer. Not only are my apps more robust, they are also better architected because testing forces you to do good software design. However, I've noticed a rather unfortunate side effect of doing things this way, in the finished product we'll have to provide concrete instances of EmailSender and ReportBuilder.
ReportBuilder reportBuilder = new ReportBuilder();
EmailSender emailSender = new EmailSender();
Reporter reporter = new Reporter(reportBuilder, emailSender);
Now that doesn't look too bad, but this is a really really simple example. In a real application there could be hundreds of classes that need to be knitted together like this and it becomes a complex piece of code, not only to maintain, but to decide where in your app you should do it because the class(es) that do the knitting have to know about everything. An alternative that I experimented with was to have a default contructor for each class that provided the concrete instances alongside the one that injected the dependency, so our Reporter class would now look like this:
public class Reporter
{
  IReportBuilder _reportBuilder;
  IEmailSender _emailSender;

  public Reporter(IReportBuilder reportBuilder, IEmailSender emailSender)
  {
      _reportBuilder = reportBuilder;
      _emailSender = emailSender;
  }

  public Reporter()
  {
      _reportBuilder = new ReportBuilder();
      _emailSender = new EmailSender();
  }

  public void SendReport()
  {
      Email email = _reportBuilder.CreateReport();
      _emailSender.Send(email);
  }
}
But this feels really dirty. I've now got a direct dependency from the client back to the server thus breaking the Inversion of Control priciple. I can't easily use a different kind of reportBuilder or emailSender without recompiling the Reporter. Another possibility would be to use the provider pattern that's a core part of .NET, but it's not really intended for this scenario and to use it for every service class in your application would be total overkill. Of course the .NET framework also provides a component architecture, but it's also quite heavy for what we want here since it requires that each component implement IComponent and provide the plumbing to publish its service. What I need is something that will magically provide concrete instances of the interfaces that each class requires without me having to maintain a vast wiring exercise somewhere in the startup code of my application. Enter Windsor! Here's how you could use it with our Reporter example:
WindsorContainer container = new WindsorContainer();
container.AddComponent("reportBuilder", typeof(IReportBuilder), typeof(ReportBuilder));
container.AddComponent("emailSender", typeof(IEmailSender), typeof(EmailSender));
container.AddComponent("reporter", typeof(Reporter));

Reporter reporter = container.Resolve<Reporter>();
reporter.SendReport();
You create a new container instance and register each interface in your application along with the concrete class that you wish to represent it. You can get a new instance of your class by using the Resolve method. Here we get an instance of Reporter and call SendReport(). Nowhere in the code did we have to explicitly pass instances of ReportBuilder or EmailSender to Reporter or even know that Reporter required those instances. Windsor also allows you to describe your components in a configuration file rather than hard coding all those AddComponent statements. You can see the benefits. Say I wanted to write another class that needed to use IEmailSender. I would just write that class with an IEmailSender as one of its constructor parameters and add it to the container. The container would then automatically provide an IEmailSender instance. In fact, by default it would provide the same IEmailSender instance that it supplies to any other class that required this interface, although that behavior can be modified. Now, say I want to use ExchangeEmailSender rather than my existing EmailSender throughout my application, I only have to change the one configuration entry (or line of setup code) to do it, rather than searching through my application looking for every place where an IEmailSender is passed as a constructor parameter. If you want to pass ExchangeEmailSender to some components and EmailSender to others, then that can be configured too. There's much more to the Windsor container than just the inversion of control container, it also provides Aspect Oriented Programming features, automatically providing interface proxies so that you can intercept method calls and provide cross cutting services. This opens up all kinds of exciting possibilities, the obvious ones being logging, auditing, transactions and security, and I hope to blog about it some more in the future. I haven't used any of this in anger yet so I can't say what the drawbacks might be, but I can imagine that maintaining the component config file for a large project could get a bit tiresome. The advantages are obvious. It really is lightweight component based development where you provide service components that can be consumed by other components without ever having to have any direct dependencies. I'd really like to see it used in a major application. It also begs the question: shouldn't this stuff be provided by your programming language? The CLR has the potential to do a lot of this quite easily. It already knows about all the types that an application requires, it knows about interface implementation, it can intercept method calls. It's easy to imagine a future version of C# where component based programming is provided out of the box.