Замок Виндзор и IHttpHandler и IHttpHandlerFactory

Я разрабатываю приложение RIA, в котором есть javascript на клиенте (я использую Ext) и .NET на сервере, для json-rpc я использую Jayrock, хорошую библиотеку (по крайней мере, для меня), поскольку она прост и хорошо работает, я использовал его в прошлом.

Jayrock использует веб-обработчики для обслуживания запроса json-rpc, вы кодируете класс, который реализует IHttpHandler и является производным от класса Jayrock с некоторыми атрибутами, а все остальное он делает, чтобы предоставить класс javascript для браузера, чтобы он творил чудеса.

Теперь обычно веб-обработчики будут иметь конструкторы без параметров, но я хочу использовать для них DI и использовать Windsor для разрешения зависимостей для меня.

Итак, у меня будет класс, подобный следующему

    public class VistaEntidadSimpleServer :  JsonRpcVistaHandler ,IHttpHandler
{
    public VistaEntidadSimpleServer(ISomeDependecy someObject)
    {
                 someObject.doSomething();

    }


    [JsonRpcMethod("Aceptar")]
    public string Aceptar (IVista vista)
    {
        throw new NotImplementedException ();
    }


    [JsonRpcMethod("Cancelar")]
    public string Cancelar (IVista vista)
    {
        throw new NotImplementedException ();
    }


    public IVista CargarDatos(IVista vista)
    {
        throw new System.NotImplementedException();
    }

}

Итак, теперь проблема заключается в том, как заставить Виндзора посередине выполнить разрешение. После поиска и того, что, похоже, делает spring, я думаю, что могу попробовать IHttpHandlerFactory и написать что-то вроде этого

    public class CastleWindsorHttpHandlerFactory : IHttpHandlerFactory
{
    public CastleWindsorHttpHandlerFactory ()
    {
        if (container==null)
        container=(IWindsorContainer)HttpRuntime.Cache.Get("Container");
    }

    #region IHttpHandlerFactory implementation

    public IHttpHandler GetHandler (HttpContext context, string requestType, string url, string pathTranslated)
    {
        return container.Resolve<IHttpHandler>(url);
    }

    public void ReleaseHandler (IHttpHandler handler)
    {
        container.Release(handler);
    }

    #endregion

    private static IWindsorContainer container=null;
}

Настройка веб-приложения для использования фабрики для файлов ashx и создание контейнера в global.asax, настройка обработчиков с URL-адресом в качестве идентификатора и регистрация контейнера в веб-кэше.

Как вы думаете, это хорошее решение? Или я что-то здесь упускаю, есть ли другой способ разрешить контейнеру веб-обработчики?

Заранее спасибо


person Fernando Salas    schedule 21.03.2011    source источник


Ответы (1)


Вместо того, чтобы хранить контейнер в кеше, реализуйте IContainerAccessor в своем глобальном HttpApplication для ссылки на ваш контейнер. Нет необходимости хранить ссылку в CastleWindsorHttpHandlerFactory.

Кроме этого, это выглядит хорошо.

person Mauricio Scheffer    schedule 21.03.2011
comment
У меня возникла проблема после вашего предложения. Я не знаю, как получить доступ к контейнеру из метода ReleaseHandler IHttpHandlerFactory. В методе GetHandler вы получаете ссылку на HttpContext, переданную в качестве аргумента (и, следовательно, ссылку на экземпляр HttpApplication/IcontainerAccessor), но это не относится к методу ReleaseHandler. Когда я пытаюсь использовать HttpContext.Current из ReleaseHandler, веб-приложение просто молча умирает. Есть ли у вас какие-либо предложения относительно того, как мне получить доступ к IContainerAccessor в методе ReleaseHandler? - person JohannesH; 21.02.2013
comment
@JohannesH создайте новый вопрос или опубликуйте его в groups.google.com/ форум/#!forum/castle-project-users - person Mauricio Scheffer; 21.02.2013
comment
Хорошо, я буду. Хотя я скажу, что решил это, сохранив контейнер в локальном поле из метода GetHandler. Однако это кажется немного хрупким, так как я не уверен, что методы всегда вызываются последовательно... На самом деле это не задокументировано. - person JohannesH; 22.02.2013