Как я могу зарегистрировать обработчики для событий HttpApplication вне Init()

Я создаю библиотеку, которой нужно запускать некоторый код на разных этапах жизненного цикла запроса ASP.NET.

Это легко сделать при написании веб-приложения, переопределив HttpApplication.Init() и зарегистрировав там различные обработчики.

Однако я хочу сделать это из своей библиотеки во время Application_Start(); Я не хочу, чтобы потребитель переопределял Init() и вызывал оттуда мой код настройки события.

Есть ли способ добиться этого?

Вот моя идеальная установка:

// in the consumer's code
protected void Application_Start()
{
    // should ideally be able to register lifecycle event handlers from the line below
    MyLibrary.Configure(...); 
}

person ChaseMedallion    schedule 22.01.2014    source источник
comment
IMO, когда ваша библиотека запускается (я полагаю, это управляющая библиотека)... HttpApplication.Init() прошло задолго до... тогда они должны это сделать   -  person Adriano Repetti    schedule 22.01.2014
comment
Может ли ваша библиотека не предоставлять различные модули (которые реализуют IHttpModule), которые пользователь может просто добавить в конфигурацию? Это обычный способ, которым библиотеки подключаются к конвейеру, и каждый модуль Inited.   -  person Damien_The_Unbeliever    schedule 22.01.2014
comment
@Damien_The_Unbeliever: можешь привести пример? В частности, как моя библиотека может настроить эти модули (это подключение к жизненному циклу — лишь одна из вещей, которые делает библиотека, поэтому просто сделать всю библиотеку модулем недостаточно).   -  person ChaseMedallion    schedule 22.01.2014
comment
Трудно привести примеры, потому что я точно не знаю, что вы пытаетесь сделать. В библиотеке легко содержать модули, обработчики и обработчики конфигурации, так что потребителю просто нужно добавить материал (возможно, просто скопировать и вставить) в web.config. Если такие точки расширения не соответствуют тому, что пытается сделать ваша библиотека, то либо ваша библиотека слишком старается и действительно хочет быть приложением, либо вам нужно дополнительно объяснить, где и как ваша библиотека вписывается в другие приложения.   -  person Damien_The_Unbeliever    schedule 22.01.2014
comment
@Damien_The_Unbeliever: чего я пытаюсь избежать, так это наличия библиотеки, в которой есть N вещей, которые потребитель должен сделать для ее настройки. Я хотел бы иметь один вызов Configure() при запуске приложения, который делает все.   -  person ChaseMedallion    schedule 22.01.2014
comment
Не зная, чего пытается достичь ваша библиотека, я не могу ничего добавить. Но это читается так, как будто он пытается сделать слишком много вещей с помощью одного вызова API, если ему нужно проникнуть в конвейер и сделать множество других (неуказанных) вещей. Опять же, не зная специфики, я бы порекомендовал пересмотреть то, как все это держится вместе, и попытаться разбить его на модули (и его зависимости).   -  person Damien_The_Unbeliever    schedule 22.01.2014


Ответы (1)


Вы должны просто уметь делать

глобальный.asax

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        MyLib.Configure(this);
    }
}

Это здесь относится к приложению, и есть множество событий, на которые вы можете подписаться, включая события жизненного цикла запроса.

person iamkrillin    schedule 22.01.2014
comment
Не вызовет ли это проблем при использовании нескольких экземпляров HttpApplication (см. per-application" title="сколько экземпляров объекта приложения может выполняться в одном приложении"> stackoverflow.com/questions/6697409/)? - person ChaseMedallion; 22.01.2014
comment
Все должно быть в порядке, даже если у вас есть несколько экземпляров одного и того же приложения, работающих в одном и том же пуле приложений, они будут работать в изолированных доменах приложений. - person iamkrillin; 22.01.2014
comment
Кажется, это не согласуется с ответом на вопрос SO, который я разместил. В нем говорится, что экземпляры HttpApplication используются повторно, где это возможно, но для одновременной обработки нескольких запросов требуется несколько экземпляров. - person ChaseMedallion; 22.01.2014