title: How to use Castle Windsor with ASP.Net web forms?
body: <p>I am trying to wire up dependency injection with Windsor to standard asp.net web forms. I think I have achieved this using a HttpModule and a CustomAttribute (code shown below), although the solution seems a little clunky and was wondering if there is a better supported solution out of the box with Windsor?</p>
  
  <p>There are several files all shown together here</p>
  
  <pre><code>    // index.aspx.cs
      public partial class IndexPage : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              Logger.Write("page loading");
          }
  
          [Inject]
          public ILogger Logger { get; set; }
      }
  
      // WindsorHttpModule.cs
      public class WindsorHttpModule : IHttpModule
      {
          private HttpApplication _application;
          private IoCProvider _iocProvider;
  
          public void Init(HttpApplication context)
          {
              _application = context;
              _iocProvider = context as IoCProvider;
  
              if(_iocProvider == null)
              {
                  throw new InvalidOperationException("Application must implement IoCProvider");
              }
  
              _application.PreRequestHandlerExecute += InitiateWindsor;
          }
  
          private void InitiateWindsor(object sender, System.EventArgs e)
          {
              Page currentPage = _application.Context.CurrentHandler as Page;
              if(currentPage != null)
              {
                  InjectPropertiesOn(currentPage);
                  currentPage.InitComplete += delegate { InjectUserControls(currentPage); };
              }
          }
  
          private void InjectUserControls(Control parent)
          {
              if(parent.Controls != null)
              {
                  foreach (Control control in parent.Controls)
                  {
                      if(control is UserControl)
                      {
                          InjectPropertiesOn(control);
                      }
                      InjectUserControls(control);
                  }
              }
          }
  
          private void InjectPropertiesOn(object currentPage)
          {
              PropertyInfo[] properties = currentPage.GetType().GetProperties();
              foreach(PropertyInfo property in properties)
              {
                  object[] attributes = property.GetCustomAttributes(typeof (InjectAttribute), false);
                  if(attributes != null &amp;&amp; attributes.Length &gt; 0)
                  {
                      object valueToInject = _iocProvider.Container.Resolve(property.PropertyType);
                      property.SetValue(currentPage, valueToInject, null);
                  }
              }
          }
      }
  
      // Global.asax.cs
      public class Global : System.Web.HttpApplication, IoCProvider
      {
          private IWindsorContainer _container;
  
          public override void Init()
          {
              base.Init();
  
              InitializeIoC();
          }
  
          private void InitializeIoC()
          {
              _container = new WindsorContainer();
              _container.AddComponent&lt;ILogger, Logger&gt;();
          }
  
          public IWindsorContainer Container
          {
              get { return _container; }
          }
      }
  
      public interface IoCProvider
      {
          IWindsorContainer Container { get; }
      }
  </code></pre>