Я выполнял шаги в документации Microsoft Enterprise Library 5.0, чтобы создать модуль HTTP для ввода ссылки на контейнер Enterprise Library на страницы ASP .NET веб-приложение.HTTP-модуль для впрыска ASP.NET (MS Enterprise Library)
Он содержит следующий код (который также появляется на сайте here):
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<Control> GetControlTree(Control root)
{
foreach (Control child in root.Controls)
{
yield return child;
foreach (Control c in GetControlTree(child))
{
yield return c;
}
}
}
}
}
Есть целый ряд проблем, связанных с этим кодом и инструкциями, прилагаемыми к ней.
1) В инструкциях не упоминается, где разместить этот код. Поскольку это класс, я поместил его в папку App_Code моего проекта веб-сайта ASP.NET.
На самом деле, здесь есть инструкции для этого бита кода:
Создать новый класс модуля ASP.NET HTTP (с именем, например, UnityHttpModule) в проекте, который захватывает PreRequestHandlerExecute события и выполняет код, который обрабатывает полное дерево управления текущего запроса страницы, применяя метод Unity BuildUp для каждого элемента управления.
2) HttpContext.Current.Application. Метод GetContainer() не существует для меня, хотя я использую те же DLL-ссылки (я кодирую в .NET 4.0).
3) Событие OnPageInitComplete ссылается на переменную «context» ... которая, похоже, не существует в этом контексте.
Любые идеи о том, что мне здесь не хватает?
Плохо организованная на самом деле не режет - код не будет компилироваться в первую очередь и дает исключения во время выполнения, если вы внесете некоторые базовые изменения, чтобы заставить его скомпилировать. Я подробно описал это в своем ответе. –