2011-03-21 99 views
2

我正在開發一個RIA應用程序,其中有客戶端上的JavaScript(我使用分機)和服務器上的.NET,對於json-rpc我使用Jayrock這是一個不錯的圖書館(至少對我來說),因爲它很簡單,運作良好,我過去曾使用它。城堡windsor和IHttpHandler和IHttpHandlerFactory

Jayrock使用Web Handlers來處理json-rpc請求,你編寫一個實現IHttpHandler的類,並從具有某些屬性的Jayrock類派生出來,剩下的工作就是爲瀏覽器提供一個JavaScript類來完成它的魔法。

現在,一般的網絡處理器將具有無參數的構造函數,但我想用DI他們,並使用溫莎解決依賴我

所以,我會有一些類像下面

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作爲id的處理程序配置,並將包含器註冊到Web緩存中。

您認爲這是一個不錯的解決方案嗎?或者是有什麼我在這裏失蹤,有沒有另一種方法來獲得容器解決Web處理程序?在advancce

回答

2

而不是存儲在緩存中的容器

感謝,在全局HttpApplication的實施IContainerAccessor引用您的容器。無需在CastleWindsorHttpHandlerFactory中存儲參考。

除此之外,它看起來不錯。

+0

我在遇到您的建議時遇到問題。我不知道如何從IHttpHandlerFactory的ReleaseHandler方法訪問容器。在GetHandler方法中,您獲得了作爲參數傳入的HttpContext的引用(並因此引用了HttpApplication/IcontainerAccessor實例),但ReleaseHandler方法中不是這種情況。當我嘗試使用ReleaseHandler中的HttpContext.Current時,WebApp只是靜靜地死去。關於如何在ReleaseHandler方法中獲取IContainerAccessor,您有任何建議嗎? – JohannesH 2013-02-21 07:46:41

+0

@JohannesH創建一個新問題或在https://groups.google.com/forum/#!forum/castle-project-users – 2013-02-21 13:30:09

+0

發佈好吧,我會的。雖然我會說我通過將容器存儲在GetHandler方法的本地字段中來解決此問題。然而,它似乎有點脆弱,因爲我不確定這些方法總是被連續調用......它並沒有真正的記錄。 – JohannesH 2013-02-22 16:54:16