我正在开发一个RIA应用程序,其中客户端上有javascript(我使用Ext)和服务器上的.NET,对于json-rpc我使用Jayrock这是一个不错的选择图书馆(至少对我而言)因为它很简单而且运作良好,我过去曾经使用它。
Jayrock使用Web处理程序来提供json-rpc请求,您编写了一个实现IHttpHandler的类,并从一个具有一些属性的Jayrock类派生,其余的工作是为浏览器提供一个javascript类来实现它的魔力。
现在,通常web处理程序将具有无参数构造函数,但我想在它们上使用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();
}
}
所以,现在问题是如何让windsor在中间做解决。在四处搜索之后,我认为我可以尝试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;
}
配置Web应用程序以将工厂用于ashx文件,并在global.asax中创建容器,使用url asids配置处理程序,并将containter注册到Web缓存中。
您认为这是一个不错的解决方案吗?或者我在这里缺少什么,是否有其他方法可以通过容器解决Web处理程序?
先谢谢
答案 0 :(得分:2)
不是将容器存储在缓存中,而是在全局HttpApplication中实现IContainerAccessor
以引用容器。无需在CastleWindsorHttpHandlerFactory
中存储引用。
除此之外,它看起来不错。