城堡windsor和IHttpHandler和IHttpHandlerFactory

时间:2011-03-21 22:11:42

标签: inversion-of-control castle-windsor castle ihttphandler

我正在开发一个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处理程序?

先谢谢

1 个答案:

答案 0 :(得分:2)

不是将容器存储在缓存中,而是在全局HttpApplication中实现IContainerAccessor以引用容器。无需在CastleWindsorHttpHandlerFactory中存储引用。

除此之外,它看起来不错。