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