title: ASP.NET Dependency Injection HTTP Module (MS Enterprise Library)
body: <p>I've been following the steps in the 'Microsoft Enterprise Library 5.0' documentation to create a HTTP module to inject a reference to the Enterprise Library container into the pages of ASP.NET web application. </p>
  
  <p>It contains the following code (which also appears online <a href="http://msdn.microsoft.com/en-us/library/ff664534%28v=pandp.50%29.aspx" rel="nofollow">here</a>): </p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Web;
  using System.Web.UI;
  using Microsoft.Practices.Unity;
  
  namespace Unity.Web
  {
    public class UnityHttpModule : IHttpModule
    {
      public void Init(HttpApplication context)
      {
        context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
      }
  
      public void Dispose() { }
  
      private void OnPreRequestHandlerExecute(object sender, EventArgs e)
      {
        IHttpHandler currentHandler = HttpContext.Current.Handler;
        HttpContext.Current.Application.GetContainer().BuildUp(
                            currentHandler.GetType(), currentHandler);
  
        // User Controls are ready to be built up after page initialization is complete
        var currentPage = HttpContext.Current.Handler as Page;
        if (currentPage != null)
        {
          currentPage.InitComplete += OnPageInitComplete;
        }
      }
  
      // Build up each control in the page's control tree
      private void OnPageInitComplete(object sender, EventArgs e)
      {
        var currentPage = (Page)sender;
        IUnityContainer container = HttpContext.Current.Application.GetContainer();
        foreach (Control c in GetControlTree(currentPage))
        {
          container.BuildUp(c.GetType(), c);
        }
        context.PreRequestHandlerExecute -= OnPreRequestHandlerExecute;
      }
  
      // Get the controls in the page's control tree excluding the page itself
      private IEnumerable&lt;Control&gt; GetControlTree(Control root)
      {
        foreach (Control child in root.Controls)
        {
          yield return child;
          foreach (Control c in GetControlTree(child))
          {
            yield return c;
          }
        }
      }
    }
  }
  </code></pre>
  
  <p>There are a number of problems with this code and the instructions that came with it.</p>
  
  <p>1) The instructions don't mention where to place this code. Since it is a class, I placed it in the App_Code folder of my ASP.NET website project. </p>
  
  <p>In fact, here is the instructions for this bit of code: </p>
  
  <blockquote>
    <p>Create a new ASP.NET HTTP module class (named, for example,
    UnityHttpModule ) in your project that captures the
    PreRequestHandlerExecute event and executes code that walks the
    complete control tree of the current page request, applying the Unity
    BuildUp method to each control.</p>
  </blockquote>
  
  <p>2) The <em>HttpContext.Current.Application</em>.<strong>GetContainer()</strong> method does not exist for me, even though I have the same DLL references used (I'm coding in .NET 4.0). </p>
  
  <p>3) The OnPageInitComplete event references a 'context' variable... which doesn't seem to exist in this context. </p>
  
  <p>Any ideas on what I'm missing here? </p>