Замок Виндзор и IHttpHandler и IHttpHandlerFactory - PullRequest
2 голосов
/ 22 марта 2011

Я разрабатываю приложение 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();
    }

}

Итак, теперь проблема заключается в том, как получить Виндзор в середине, чтобы выполнить разрешение.После поиска и того, что он делает весной, я думаю, что могу попробовать 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-адресом в качестве идентификаторов и регистрация контейнера в веб-кеше.

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

Спасибо за продвижение

1 Ответ

2 голосов
/ 22 марта 2011

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

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

...